转载请注明出处:http://blog.csdn.net/a1dark
分析:kruskal模板算法、原理很简单、就是先把边从小到大排个序、然后并查集、并在一起就OK、
#include<stdio.h> #include<algorithm> using namespace std; struct node{ int s,e; int val; }flag[5050]; int map[5050]; int n; int cmp(node a,node b){ if(a.val<b.val) return 1; else return 0; } void init(){ for(int i=1;i<=n*(n-1)/2;i++) map[i]=i; } int find(int x){ int r=x; while(r!=map[r]) r=map[r]; int b=x; int f; while(b!=r){ f=map[b]; map[b]=r; b=f; } return r; } int merge(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy){ map[fx]=fy; return 1; } return 0; } int main(){ while(scanf("%d",&n)!=EOF){ if(n==0)break; for(int i=0;i<n*(n-1)/2;i++){ scanf("%d%d%d",&flag[i].s,&flag[i].e,&flag[i].val); } sort(flag,flag+(n*(n-1)/2),cmp); int sum=0,ans=0; init(); for(int i=0;i<n*(n-1)/2;i++){ ans=merge(flag[i].s,flag[i].e); if(ans) sum+=flag[i].val; } printf("%d ",sum); } return 0; }