HDU1863-畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1863
#include<iostream> #include<cstdio> #define N 5050 using namespace std; int fa[N],sum,n,m; struct edge { int s,t,w; }e[N]; int cmp(const void *a,const void *b) { return (*(edge *)a).w-(*(edge *)b).w; } int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int merge(edge e) { int x,y; x=find(e.s); y=find(e.t); if(x!=y) { ++sum; fa[x]=y; return e.w; } return 0; } int kruskal() { int i,ans=0; for(i=1;i<=m;i++) fa[i]=i; qsort(e,n,sizeof(edge),cmp); for(i=0;i<n;i++) { ans+=merge(e[i]); if(sum==m) return ans; } if(sum<m) return -1; } int main(void) { int i,ans; while(scanf("%d%d",&n,&m),n) { sum=1; for(i=0;i<n;i++) scanf("%d%d%d",&e[i].s,&e[i].t,&e[i].w); ans=kruskal(); if(ans==-1) printf("?\n"); else printf("%d\n",ans); } return 0; }