/*并查集模板*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define N 50005
int n, m;
int f[N];
void init()//初始化
{
for (int k = 1; k <= n; k++)
f[k] = k;
return;
}
int find(int x)//寻根
{
if (f[x] == x)
return x;
else
return f[x] = find(f[x]);//路径压缩,顺带把路上的结点的boos改为最后祖宗的编号,提高效率
}
void merge(int x, int y)//合并集合
{
int t1, t2;
t1 = find(x);
t2 = find(y);
if (t1 != t2)
f[t2] = t1;//靠左原则
return;
}
bool same(int x, int y)
{
return find(x) == find(y);
}
int main()
{
int cas = 0;
while (scanf("%d%d", &n, &m) != EOF && (n||m))//输入结点数和关系数
{
int sum = 0;
int x, y;
init();//初始化
for (int i = 0; i < m; i++)//融合结点
{
scanf("%d%d", &x, &y);
merge(x, y);
}
for (int i = 1; i <= n; i++)
{
if (f[i] == i)
sum++;
}
printf("Case %d: %d\n", ++cas, sum);
}
return 0;
}
poj2524并查集模板
最新推荐文章于 2022-03-27 22:50:36 发布