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;
}