畅通工程
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; struct node { int i; int j; int v; }T[5000]; int father[110],rank[110]; int N,M,t; int cmp(node a,node b) { return a.v<b.v; } int find(int x) { return x==father[x]?x:father[x]=find(father[x]); } void merge(int x,int y) { x=find(x),y=find(y); if(x!=y) { father[x]=y; rank[y]+=rank[x]; //统计数据能以畅通 if(rank[y]>t) t=rank[y]; } } int krusal( ) { int i,a,b,c,sum=0; for(i=0;i<N;i++) { a=T[i].i,b=T[i].j,c=T[i].v; if(find(a)!=find(b)) { sum+=c; merge(a,b); } } return sum; } int main( ) { while(scanf("%d%d",&N,&M),N) { t=0; int i,j,a,b,c; for(i=1;i<=M;i++) { father[i]=i; rank[i]=1; } for(i=0;i<N;i++) { scanf("%d%d%d",&a,&b,&c); T[i].i=a; T[i].j=b; T[i].v=c; } sort(T,T+N,cmp); //克鲁斯卡尔算法,先排序,费用从小到大。。 j=krusal(); if(t<M) puts("?"); else printf("%d\n",j); } return 0; }
posted on 2011-04-30 10:32 more think, more gains 阅读(150) 评论(0) 收藏 举报