您的位置:首页 > 其它

hdoj1232 畅通工程(并查集)

2017-12-01 10:13 489 查看

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1232

思路

使用并查集求解。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 1000 + 10;
int p
;

void make_set(int n)
{
for (int i = 1; i <= n; i++)
p[i] = -1;
}

int find_root(int i)
{
if (p[i] == -1)
return i;
else
{
int t = find_root(p[i]);    //路径压缩
p[i] = t;
return t;
}
}

void union_set(int a, int b)
{
int ra = find_root(a);
int rb = find_root(b);
if (ra != rb)
p[ra] = rb;

}

int main()
{
//freopen("hdoj1232.txt", "r", stdin);
int n, m;
while (scanf("%d%d", &n, &m) == 2 && n)
{
make_set(n);
int a, b;
for (int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
union_set(a, b);
}
int ans = 0;
for (int i = 1;i <= n;i++)
if (p[i] == -1) ans++;
printf("%d\n", ans - 1);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: