http://acm.hdu.edu.cn/showproblem.php?pid=1232
本人并查集专题:http://blog.csdn.net/fsafs168/article/details/7801010
/*
* 并查集,直接标准写法秒过
* 思路:所谓畅通工程反向思维一下就是不畅通的有几块。
* 相应的建立的路就是:不畅通的块数-1
*/
#include <stdio.h>
int father[1010];
void ini(int n)
{
for(int i=0;i<=n;i++)
father[i] = i;
}
int find(int x)
{
if(x != father[x])
return find(father[x]);
return father[x];
}
void sert(int a, int b)
{
father[a] = b;
}
int main()
{
int n,m,i,j;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d",&m);
ini(n);
for(i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a = find(a); //找根节点
b = find(b); //找根节点
if(a!=b)
sert(a,b);
}
int sum = -1; //肯定是-1啦,因为至少有一块地方么
for(i=1;i<=n;i++)
{
if(i == find(i)) //有多少根节点
sum++;
}
printf("%d\n",sum);
}
return 0;
}