3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3 5#include<stdio.h> #include<algorithm> using namespace std; int pre[5000]; struct st { int a,b,m; }data[5000]; int find(int N) //查找结点的根 { return pre[N]==N?N:pre[N]=find(pre[N]); } int join(int x,int y,int z,int *ans)//将结点间合并,并加上最短的距离。 { int fx=find(x),fy=find(y); if(fx!=fy) { pre[fx]=fy; (*ans)+=z; } } int cmp(st a,st b)//按城镇路程从小到大排序。 { return a.m<b.m; } int main() { int i,n,k; while(scanf("%d",&n),n) { int k=(n-1)*n/2,sum=0; for(i=1;i<=k;i++) //初始化。 { pre[i]=i; } for(i=1;i<=k;i++) { scanf("%d %d %d",&data[i].a,&data[i].b,&data[i].m); } sort(data+1,data+k+1,cmp); for(i=1;i<=k;i++) { join(data[i].a,data[i].b,data[i].m,&sum); } printf("%d\n",sum); } return 0; }
原文:http://blog.csdn.net/hdd871532887/article/details/40422141