hdu1233: 还是畅通工程

hdu1233: http://acm.hdu.edu.cn/showproblem.php?pid=1233
题意:全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 解法:最小生成树:Kruskal code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int v[10000],k[10000],w[10000],r[10000],fa[200];
int find(int a)
{
    return fa[a]==a?a:a=find(fa[a]);
}
int cmp(int i,int j)
{
    return w[i]<w[j];
}
int main()
{
    int n,ans,x,y;
    while(1)
    {
        ans=0;
        scanf("%d",&n);
        if(n==0)break;
        for(int i=0;i<(n*(n-1))/2;i++)
        {
            scanf("%d%d%d",&v[i],&k[i],&w[i]);
            v[i]=v[i]-1;k[i]=k[i]-1;
            r[i]=i;
        }
        for(int i=0;i<n;i++)
        {
            fa[i]=i;
        }
        sort(r,r+(n*(n-1))/2,cmp);
        for(int i=0;i<(n*(n-1))/2;i++)
        {
            x=find(v[r[i]]);
            y=find(k[r[i]]);
            if(x!=y)
            {
               ans=ans+w[r[i]];
               fa[x]=y;
            }
        }
        printf("%d\n",ans);
    }
}
/*input:
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
output:
3
5*/

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

导航