HDU-3371-Connect the Cities
http://acm.hdu.edu.cn/showproblem.php?pid=3371
最小生成树,已知有些节点已经相连
#include<stdio.h> #include<string.h> #include<stdlib.h> struct cam { int x; int y; int len; }list[25005*3]; int f[505]; int n,m,k; int find(int x) { int r=x; while(f[r]!=r) r=f[r]; f[x]=r; return f[x]; } void Union(int x,int y) { int xx,yy; xx=find(x); yy=find(y); if(xx!=yy) f[xx]=yy; } int cmp(const void *a,const void *b) { return (*(struct cam *)a).len-(*(struct cam *)b).len; } void solve() { int i,sum,ans,a,b; sum=0; ans=0; for(i=1;i<=n;i++) if(f[i]!=i) sum++; for(i=0;i<m;i++) { a=list[i].x; b=list[i].y; if(find(a)!=find(b)) { Union(a,b); sum++; ans+=list[i].len; if(sum==n-1) break; } } if(sum==n-1) printf("%d\n",ans); else printf("-1\n"); } int main() { int t,i,j,tt,w,father1,w1; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++) f[i]=i; for(i=0;i<m;i++) scanf("%d%d%d",&list[i].x,&list[i].y,&list[i].len); qsort(list,m,sizeof(struct cam),cmp); for(i=1;i<=k;i++) { scanf("%d",&tt); if(tt>0) { scanf("%d",&w); father1=find(w); for(j=2;j<=tt;j++) { scanf("%d",&w1); f[find(w1)]=father1; } } } if(n==1) { printf("0\n"); continue; } solve(); } system("pause"); return 0; }