额。并查集也称为不相交集数据结构。
遵循擒贼先擒王的原则。
题目链接:
点击打开链接
附上AC代码(C语言):
#include<stdio.h>
int f[1000] = {0};
void init() //初始化
{
int i;
for(i = 1;i <= 1000;i++)
{
f[i] = i;
}
return ;
}
int get(int x) //这个是找爹的递归函数,直到找到最高级别为止,就是擒贼先擒王的原则。
{
if(f[x] == x)
{
return x;
}else
{
f[x] = get(f[x]);
return f[x];
}
}
int merge(int u,int v) //合并两子集
{
int t1,t2;
t1 = get(u);
t2 = get(v);
if(t1!=t2)
{
f[t2] = t1;
return 1; //以左为大
}
return 0;
}
int main()
{
int n,m;
int i,x,y;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n == 0)break;
init();
int count = n - 1;//开始若有n个点,则需要修建n-1条路
for(i = 1;i <= m;i++)
{
scanf("%d %d",&x,&y);
if(merge(x,y)==1)
{
count --;//合并后少修一条路
}
}
printf("%d\n",count);
}
return 0;
}