hdu 1232 畅通工程(并查集的应用)

来源:互联网 发布:英克软件怎么样 编辑:程序博客网 时间:2024/04/28 20:40

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232


并查集在之前博客中写过了,便不赘述了。

在并查集的基础上在处理好两点即可:

1.怎样将城镇加到对应的城镇群

2.怎样得到单独的城镇群的数量


详见代码:

//看并查集#include<iostream>#include<cstring>#include<string>#include<cstdio>using namespace std;int pre[1000 + 10];bool root[1000 + 10];int Find(int x)//并查集{    int p = x;    while (pre[p] != p)        p = pre[p];    int i = x, j;    while (pre[i] != p)//路径压缩    {        j = pre[i];        pre[i] = p;        i = j;    }    return p;}void join(int u, int v)//根部连接u,v  将城镇加到相应的城镇群,只需处理根节点即可{    int fu = Find(u), fv = Find(v);    if (fu != fv)        pre[fv] = fu;    return;}int main(){    int N, M;    while (cin >> N&&N)    {        int ans = 0;        memset(root, 0, sizeof(root));        cin >> M;        for (int i = 0; i <= N; i++)            pre[i] = i;        int u, v;        for (int i = 1; i <= M; i++)        {            scanf("%d%d", &u, &v);            join(u, v);        }        for (int i = 1; i <= N; i++)//标记根即独立的城镇群        {            root[Find(i)] = true;        }        for (int i = 1; i <= N; i++)//得到独立的城镇群的个数        {            //cout << root[i] << " ";            if (root[i]) ans++;        }        cout << ans-1 << endl;    }    return 0;}


0 0
原创粉丝点击