并查集的水题,模板一套,基本什么都不用改。
代码如下:
#include <stdio.h>
#define MAXN 1010
int root[MAXN], ans;
int Find(int x)
{
while(x != root[x])
{
x = root[x];
}
return x;
}
void Union(int x, int y)
{
x = Find(x);
y = Find(y);
if(x != y)
{
root[x] = y;
ans --; //每连通一个,道路数就该减1
}
}
int main()
{
int N, M;
int s1, s2;
while(scanf("%d", &N),N)
{
scanf("%d", &M);
ans = N-1;
for(int i = 1; i <= N; i++) //i应该从1开始,不然N点找不到root初始化的值,这里有点小坑。。。WA了几次
{
root[i] = i;
}
for(int i = 0; i < M; i++)
{
scanf("%d %d", &s1, &s2);
Union(s1, s2);
}
printf("%d\n", ans);
}
return 0;
}
本文介绍了一道经典的并查集算法题目,并提供了一个简洁的实现模板。通过这个模板可以快速解决并查集的基本问题,如查找根节点、进行元素合并等。适合初学者学习并查集的基本操作。
925

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



