分析:Kruskal算法思想:按照边的权值的顺序从小到大查看一遍,如果不产生环(重边也算在内),就把当前这条边加入到生成树中。
#include<stdio.h> #include<algorithm> using namespace std; int per[110]; int n; struct stu { int u,v,w; }edge[10000]; int cmp(stu x,stu y) { return x.w<y.w; } void init() { for(int i=1;i<=110;i++) per[i]=i; } int find(int x) { if(x==per[x]) return x; else return per[x]=find(per[x]); } bool join(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy)//确定是否生成环 { per[fy]=fx; return true; } else return false; } int main() { while(scanf("%d",&n),n) { int i,sum=0,m; m=n*(n-1)/2; init(); for(i=0;i<m;i++)//注意下标 scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); sort(edge,edge+m,cmp);//注意下标 for(i=0;i<m;i++) { if(join(edge[i].u,edge[i].v)) sum+=edge[i].w; } printf("%d\n",sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-08 23:56:36