#include <stdio.h>
int f[10001];
int n,m;
//初始化标记
void init()
{
for(int i = 1; i <= n; ++i)
f[i] = i;
}
//寻找连接的城市的关系
int getf(int num)
{
if(num == f[num])
return num;
else
{
f[num] = getf(f[num]);
return f[num];
}
}
//合并相互连接的城市
void merge(int x, int y)
{
int t1,t2;
t1 = getf(x);
t2 = getf(y);
if(t1 != t2)
f[t2] = t1;
}
int main()
{
int f1,f2,sum;
while(scanf("%d",&n) && n)
{
scanf("%d",&m);
sum = 0;
init();
for(int i = 1; i <= m; ++i)
{
scanf("%d %d",&f1,&f2);
merge(f1,f2);
}
if(m != 0)
{
for(int i = 1; i <= n; ++i)
if(i == f[i])
++sum;
}
else
sum = n;
printf("%d\n",--sum);
}
return 0;
}
hdu 1232 畅通工程(并查集)
最新推荐文章于 2022-11-17 00:01:32 发布