这个题目的主要思想是每次输入一条边,判断这两个顶点的关系,然后修改其祖先节点的信息。
感觉并查集有点死,似乎基本的思路不变,就是修改祖先的时候可能有些小的变化,以后的文章会有体现。这个确实很普通。
#include<stdio.h>
int father[1000];
int find_ant(int a)
{
int r=a;
while(father[r]!=r)
r=father[r];
return r;
}
void unin(int a,int b)
{
int fa,fb;
fa=find_ant(a);
fb=find_ant(b);
if(fa!=fb)
father[fa]=fb;
}
int main()
{
int n,m,i,a,b,count;
while(scanf("%d",&n))
{
if(n==0)
break;
count=0;
scanf("%d",&m);
for(i=1;i<=n;i++)
father[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
unin(a,b);
}
for(i=1;i<=n;i++)
if(father[i]==i)
count=count+1;
printf("%d\n",count-1);
}
return 0;
}