#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1010
int tag[N];
int pre[N];
int find(int x)
{
int i=x;
while(pre[i]!=i)
{
i=pre[i];
}
int k=x,j;
while(pre[k]!=i)//将所有的与x有关联的数都合并到i下面
{
j=pre[k];
pre[k]=i;
k=j;
}
return i;
}
void mix(int x,int y)
{
int fx=find(x);//找到父亲先,这样才能降低路径!!
int fy=find(y);//这个要加上,否者TLE
if(fx!=fy)
pre[fx]=fy;
}
int main()
{
int i,j,n,m,A,B,ans;
while(scanf("%d%d",&n,&m)&&n)
{
for(i=1;i<=n;i++)
pre[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d%d",&A,&B);
mix(A,B);
}
memset(tag,0,sizeof(tag));
for(i=1;i<=n;i++)
{
tag[find(i)]=1;
}
for(ans=0,i=1;i<=n;i++)
{
if(tag[i])
ans++;
}
ans--;
printf("%d\n",ans);
}
//system("pause");
return 0;
}
/*
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
*/
hdu1232
最新推荐文章于 2021-09-23 13:41:44 发布