HDOJ 1232 畅通工程

题目传送:HDOJ 1232 畅通工程

解题思路:本题可以理解为一张无向图中给定部分连通分量,求多条连通分量间,需要至少多少条连线可以使图变为一条连通分量。对于无向图求连通分量个数问题,可以采用并查集的方法解决。

并查集:一种树形结构,常用于处理不相交集合的合并和查询问题。

相关链接:数据结构之并查集

本题代码:

#include <stdio.h>

int father[1010];

int findFather(int a)//寻找结点的祖父结点
{
    while(father[a]!=a)
        a=father[a];

    return a;
}

void merge(int x, int y)//祖父结点不同则合并
{
    int fx,fy;

    fx=findFather(x);
    fy=findFather(y);

    if(fx!=fy)
        father[fx]=fy;
}

int main()
{
    int n,m,i,a,b,ans;

    while(scanf("%d", &n) && n!=0)
    {
        for(i=1;i<=n;i++)
            father[i]=i;
        
        scanf("%d", &m);

        for(i=1;i<=m;i++)
        {
            scanf("%d%d", &a, &b);
            merge(a, b);
        }

        ans=-1;
        for(i=1;i<=n;i++)
            if(i==father[i])
                ans++;

        printf("%d\n", ans);
    }

    return 0;
}

 

posted @ 2012-12-20 17:57  任琦磊  阅读(273)  评论(0编辑  收藏  举报