本题链接:点击打开链接
本题大意:
有n个村庄,n*(n-1)/2条路,输入每条路所连接是哪两个村庄及长度,求使全部村庄均连通(并不是都两两连通)
所铺公路的最短路程。
解题思路:
使用并查集基础及Kruskal算法。使用一结构体存放该条路所连接的两个村庄及公路长度。
參考代码:
#include<stdio.h> #include<algorithm> using namespace std; int per[110]; int n; struct node{ int u,v,w; }a[10000]; int cmp(node a,node b) { return a.w<b.w; } void init() { for(int i=1;i<=n;i++) per[i]=i; } int find(int x) { if(per[x]==x) return x; else return per[x]=find(per[x]); } bool join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { per[fx]=fy; return true; } else { return false; } } int main() { while(scanf("%d",&n)!=EOF&&n) { int m=n*(n-1)/2; for(int i=0;i<m;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); init(); sort(a,a+m,cmp); int sum=0; for(int i=0;i<m;i++) { if(join(a[i].u,a[i].v)) sum+=a[i].w; } printf("%d ",sum); } return 0; }