题目地址:点击打开链接
思路:并查集模板
AC代码:
#include<stdio.h>
int pre[1000];
int find(int x)
{
int r=x,i=x,j;
while(pre[r]!=r)
{
r=pre[r];
}
while(pre[i]!=r)// 四弟告诉三弟咱的老大是谁,然后三弟告诉二弟咱的老大是谁,二弟的老大就是老大就不用告诉了,这是路径压缩
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
int join(int x,int y)
{
if(find(x)!=find(y))
pre[find(y)]=find(x);
return 0;
}
int main()
{
int n,m,i,x,y,sum;
while(scanf("%d%d",&n,&m)&&n)
{
sum=0;
for(i=1;i<=n;i++)
{
pre[i]=i;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
join(x,y);
}
for(i=1;i<=n;i++)
{
if(pre[i]==i)
sum++;
}
printf("%d\n",sum-1);
}
return 0;
}
用递归方法求自己的老大也可以
int find(int x)
{
int r;
r = x;
if(pre[r] == r)
return r;
return(find(pre[r]));
}
这个find更简洁
int find(int x)
{
return x == pre[x] ? x : pre[x] = find(pre[x]);//找老大加路径压缩
}