#include <stdio.h>
#define N 1000
int Tree[N];
int findRoot(int x) {
if(Tree[x] == -1) return x;
else {
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
int main() {
int m, n;
int i;
while(scanf("%d", &n) != EOF && n != 0) {
scanf("%d", &m);
for(i = 1; i <= n; i ++) Tree[i] = -1;
while(m-- != 0) {
int a, b;
scanf("%d%d", &a, &b);
a = findRoot(a);
b = findRoot(b); //查找边的两个顶点所在集合信息
if(a != b) Tree[a] = b;
}
int ans = 0;
for(int i = 1; i <= n; i ++) {
if(Tree[i] == -1) ans ++;
}
printf("%d\n", ans - 1);
}
return 0;
}并查集的应用(05年浙大复试上机题畅通工程)
最新推荐文章于 2023-10-22 22:47:09 发布
本文介绍了一个使用并查集算法解决图论问题的C语言程序示例。该程序通过不断合并节点来寻找连通分量,并最终计算出图中不相连的独立集合的数量。文章详细展示了如何定义并查集结构、实现查找根节点与合并操作的方法。
301

被折叠的 条评论
为什么被折叠?



