http://acm.hdu.edu.cn/showproblem.php?pid=1863
裸的最小生成树,只需多判断一下是否连通,我用的方法是看是否只有一个根节点。
ps:m和n写反了,害我查了1h啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> int idx[1000000]; struct node{ int a,b,cost; }r[1000000]; int cmp(const void*a,const void*b) { return (*(struct node*)a).cost-(*(struct node*)b).cost; } int find(int n) { return idx[n]==n?n:idx[n]=find(idx[n]); } int main() { int i,n,m; int p,q; int f; while(scanf("%d",&n),n) { scanf("%d",&m); for(i=1;i<=m;i++) idx[i]=i; for(i=0;i<n;i++) scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].cost); qsort(r,n,sizeof(struct node),cmp); int cost=0; for(i=0;i<n;i++) { p=find(r[i].a); q=find(r[i].b); if(p!=q) { cost+=r[i].cost; idx[p]=q; } } f=0; for(i=1;i<=m;i++) if(find(i)==i) f++; if(f>1) printf("?\n"); else printf("%d\n",cost); } return 0; }