最小生成树

//最小生成树 用了贪心的思想每次选符合条件的最短边直到边取完 或 所有点之间已可互达。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<cmath> using namespace std; const int MAXN = 1000; struct edge { int u,e,v; }e[MAXN*100]; bool cmp(edge a,edge b) { return a.v<b.v; } int f[MAXN*MAXN]; int find(int x) { if(f[x]==x)return f[x]; else return f[x]=find(f[x]); } int main() { int n,m,ans=0; while(scanf("%d",&n)!=EOF && n!=0 ) { ans=0; int m=(n-1)*n/2; for(int i=1;i<=m;i++){ int x,y,z;scanf("%d%d%d",&x,&y,&z); e[i].u=x;e[i].e=y;e[i].v=z; } for(int i=1;i<=n;i++) f[i]=i; sort(e+1,e+m+1,cmp); int road=n-1; for(int i=1;i<=m;i++) { int x=find(e[i].u); int y=find(e[i].e); if(x!=y) { f[x]=y; ans+=e[i].v; road--; } if(road==0) break; } cout<<ans<<endl; } return 0; }

 

posted @ 2014-11-06 15:30  endl  阅读(103)  评论(0编辑  收藏  举报