hdu1232: 畅通工程

hdu1232: http://acm.hdu.edu.cn/showproblem.php?pid=1232
题意:给几条边(可能重复给),求至少还需几条边能使各点直接或者间接联系 解法:并查集:把已知的有联系的边减掉。 code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int fa[1005],n,m;
void solve(int a,int b)
{
    for(int i=1;i<=n;i++)
        if(fa[i]==a)
            fa[i]=b;
}
int main()
{
    int ans,a,b;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        for(int i=1;i<=n;i++)
            fa[i]=i;
        scanf("%d",&m);ans=n-1;  //n个节点的最小生成树的边数为n-1
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            if(fa[a]!=fa[b])
            {
                solve(fa[b],fa[a]);
                ans--;
            }
        }
        printf("%d\n",ans);
    }
}
/*input:
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
output:
1
0
2
998*/

posted on 2012-07-25 17:17  acmer-jun  阅读(98)  评论(0编辑  收藏  举报

导航