标签:
本题链接:点击打开链接
本题大意:
有n个村庄,之后输入每个村庄到所有村庄间的距离,然后输入已连通道路数目,及该道路所连通的是哪两个村庄。
求使所有村庄均连通所需修道路最短距离。
解题思路:
此题有两种方法可解,此处使用的是kruskal算法,首先输入所有村庄道路的距离,然后将每条道路连通的两个村庄及道路距离用一结构体存起来,按距离从小到大排序。然后将乙连通的道路先加到树中,然后再对每条道路进行判断,将需修建的距离加起来即可。
参考代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int per[110]; struct node{ int start; int end; int dis; }a[11000]; int cmp(node a,node b) { return a.dis<b.dis; } int find(int x) { int r=x; while(r!=per[r]) r=per[r]; int j,i=x; while(i!=r) { j=per[i]; per[i]=r; i=j; } return r; } void join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) per[fx]=fy; } int main() { int n,m,s,e,d; while(scanf("%d",&n)!=EOF) { int k=0; for(int i=1;i<=n;i++) { per[i]=i; for(int j=1;j<=n;j++) { scanf("%d",&d); a[k].start=i; a[k].end=j; a[k++].dis=d; } } sort(a,a+k,cmp); scanf("%d",&m); while(m--) { scanf("%d%d",&s,&e); join(s,e); } int sum=0; for(int i=0;i<k;i++) { if(find(a[i].start)!=find(a[i].end)) { join(a[i].start,a[i].end); sum+=a[i].dis; } } printf("%d\n",sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lsgbb/article/details/47447705