HDU 1863 畅通工程

并查集+最小生成树

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

const int M=124;
const int N=124*124;
int fa[M];
int m,n;

int find(int x)
{
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}

struct node
{
    int s,t,w;
}edge[N];

void init()
{
    for(int i=1;i<=m;i++) fa[i]=i;
}
int cmp(const node &a,const node &b)
{
    return a.w<b.w;
}
int main()
{
    int i;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0) break;

        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w);
        }

        init();
        sort(edge,edge+n,cmp);
        int ans=0;
        for(i=0;i<n;i++)
        {
            int u=find(edge[i].s);
            int v=find(edge[i].t);
            if(u!=v)
            {
                fa[u]=v;
                ans+=edge[i].w;
                m--;
            }
        }

        if(m>1) printf("?\n");
        else printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2015-08-13 15:09  雲碧  阅读(97)  评论(0)    收藏  举报