HDU1232——畅通工程【并查集】

<题目链接>

题目大意:

利用并查集找出图中有几个不连通的城镇集合,所需修的道路数即为城镇集合-1。

#include <stdio.h>
int pre[1005];

int find(int x)
{
    int r = x;
    while (pre[r] != r)
        r = pre[r];
    int i = x; int j;
    while (pre[i] != r)          
    {
        j = pre[i];
        pre[i] = r;
        i = j;
    }
    return r;
}

void join(int a,int b)
{
    int f1 = find(a);
    int f2 = find(b);
    if (f1 != f2)
    {
        pre[f2] = f1;
    }
}
int main()
{
    int n, m, i, j,ans,a,b;
    while (scanf("%d%d", &n, &m) != EOF, n)
    {
        for (i = 1; i <= n; i++)pre[i] = i;
        for (i = 0; i < m; i++)
        {
            scanf("%d%d", &a, &b);
            join(a, b);
        }
        ans = 0;
        for (i = 1; i <= n; i++)
        {
            if (pre[i] == i)ans++;         //记录下这个图中有几个联通分支
        }
        printf("%d
", ans - 1);
    }//联通所需的道路就是联通分支数-1
    return 0;
}

2018-04-02


作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/00isok/p/8698490.html