3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?
最小生成树的判定方法有kruskal算法和prim算法
我认为kruskal算法比较简单。。。
#include <stdio.h> #include <algorithm> using namespace std; int m,n,fa[105]; struct node { int a,b,cost; }c[105]; bool cmp(node x,node y) { return x.cost<y.cost; } void init() { for(int i=1;i<=n;i++) fa[i]=i; } int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } int main() { while(scanf("%d %d",&m,&n)!=EOF) { if(m==0) break; init(); for(int i=0;i<m;i++) scanf("%d %d %d",&c[i].a,&c[i].b,&c[i].cost); sort(c,c+m,cmp); int sum=0; for(int i=0;i<m;i++) { int x=find(c[i].a); int y=find(c[i].b); if(x!=y) fa[x]=y,sum+=c[i].cost; } int count=0; for(int i=1;i<=n;i++) if(fa[i]==i) count++; if(count==1) printf("%d\n",sum); else printf("?\n"); } return 0; }