首页 > 代码库 > 最小生成树

最小生成树

//最小生成树 用了贪心的思想每次选符合条件的最短边直到边取完 或 所有点之间已可互达。
#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;}

 

最小生成树