HDU 1232 暢通工程(最小生成樹)

題目分析:本題主要是要找出有幾個點是獨立的,沒有連通的,因此本題才用並查集的方法最佳。

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



發佈了23 篇原創文章 · 獲贊 0 · 訪問量 5753
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章