hdu1863 kruskal(最小生成树)

来源:互联网 发布:网络电影分账截图 编辑:程序博客网 时间:2024/06/05 14:12
 
#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int  NM=110;int parent[NM];int N,M;struct  Edge{        int u;        int v;        int w;}edge[NM];bool cmp(Edge a,Edge b){         return a.w<b.w;}void init(){        for(int i=1;i<=M;i++)        parent[i]=i;} int find(int x){        if(x!=parent[x])        return find(parent[x]);        return x;}void Union(int x,int y){        int xx=find(x);        int yy=find(y);        if(xx!=yy)        {                 parent[xx]=yy;        }}int kruskal(){        int sum=0,uu,vv,up,vp,count=0;        sort(edge,edge+N,cmp);        //cout<<"M="<<M<<endl;        for(int i=0;i<N;i++)        {                                 uu=find(edge[i].u);                 vv=find(edge[i].v);             //    cout<<"uu="<<uu<<" "<<"vv="<<vv<<endl;                 if(uu!=vv)                 {                           Union(uu,vv);                           count++;                           sum+=edge[i].w;                 }                  if(count>=M-1)                 break;        }       // cout<<"count="<<count<<endl;        if(count>=M-1) return sum;        else return -1; }int main(){        int s;        while(cin>>N>>M&&N)        {                init();                           for(int i=0;i<N;i++)                {                        scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);                }                s=kruskal();                                if(s==-1) printf("?\n");                else printf("%d\n",s);        }        system("pause");        return 0;}