nyoj 38 布线问题【最小生成树 Kruskal】

布线问题

时间限制:1000 ms | 内存限制:65535 KB

难度:4

描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,,该布线方式需要满足以下条件:1、把所有的楼都供上电。2、所用电线花费最少输入第一行是一个整数n表示有n组测试数据。(n<5)每组测试数据的第一行是两个整数v,e.v表示学校里楼的总个数(v<=500)随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )(楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。数据保证至少存在一种方案满足要求。输出每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。样例输入14 61 2 102 3 103 1 101 4 12 4 13 4 11 3 5 6样例输出4代码:#include<stdio.h>#include<algorithm>using namespace std;struct record{int s,e,w;}num[200010];bool cmp1(record a,record b){return a.w<b.w;}int cmp2(int a,int b){return a<b;}int per[510],co[510];int n,m;int init(){for(int i=1;i<=n;i++){per[i]=i;}}int find(int x){int r;r=x;while(r!=per[r]){r=per[r];}per[x]=r;return r;}int join(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy){per[fx]=fy;return true;}return false;}int main(){int i,j,sum,t;scanf("%d",&t);while(t–){scanf("%d%d",&n,&m);for(i=0;i<m;i++){scanf("%d%d%d",&num[i].s,&num[i].e,&num[i].w);}sort(num,num+m,cmp1);for(j=0;j<n;j++){scanf("%d",&co[j]);}sort(co,co+n,cmp2);init();sum=0;for(i=0;i<m;i++){if(join(num[i].s,num[i].e)){sum+=num[i].w;}}printf("%d\n",sum+co[0]);}return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

看了哪些风景,遇到哪些人。尽管同学说,

nyoj 38 布线问题【最小生成树 Kruskal】

相关文章:

你感兴趣的文章:

标签云: