HDU 1232

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


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