#include<cstdio>
#include<iostream>
using namespace std;
int father[10000];//用來存父節點
int findx(int x)//查找並返回父節點
{
while(father[x]!=x)
x=father[x];
return x;
}
void mergex(int x,int y)
{
x=findx(x);
y=findx(y);
if(x!=y)//兩點父節點不相同則將其中一個歸爲另一個的孩子
{
father[x]=y;
}
}
int main()
{
int n,m,i,j;
while(scanf("%d",&n)!=EOF)
{
int sum=0;
for(int a=1;a<=n;a++)
{
father[a]=a;
}
if(n==0)
{
break;
}
scanf("%d",&m);
int t=0;
while(m--)
{
scanf("%d%d",&i,&j);
mergex(i,j);
}
for(int a=1;a<=n;a++)//查找最終有幾個父節點(有連通的已經歸到一個父節點上,所以最後只剩下連通的圖的個數)
{
if(a==father[a])
{
sum++;
}
}
printf("%d\n",sum-1);//查找結果-1即爲答案
}
return 0;
}
HDU 1232 暢通工程(最小生成樹)
題目分析:本題主要是要找出有幾個點是獨立的,沒有連通的,因此本題才用並查集的方法最佳。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.