nuoj 38布线问题(prim最小生成树)

来源:互联网 发布:php是什么 编辑:程序博客网 时间:2024/05/19 13:20

布线问题

时间限制: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

简单的最小生成树,只不过要多一个节点,把外界供电设施也当成当成一道楼,这样就可以用prim了。

#include<stdio.h>#include<string.h>using namespace std;int mat[505][505];int vis[505];int v,e;int mon[505];#define inf 0x3f3f3f3fint sum;void prim(int m){for(int i=2;i<=m;i++){mon[i]=mat[1][i];}vis[1]=1;mon[1]=0;for(int i=2;i<=m;i++){int maxx=inf;int pos;for(int j=1;j<=m;j++){if(!vis[j]&&mon[j]<maxx){maxx=mon[j];pos=j;}}vis[pos]=1;sum+=maxx;for(int j=1;j<=m;j++){if(!vis[j]&&mat[pos][j]<mon[j])mon[j]=mat[pos][j];}}printf("%d\n",sum);return ;}int main(){int t;scanf("%d",&t);while(t--){int a,b,c,d;sum=0;memset(vis,0,sizeof(vis));memset(mat,inf,sizeof(mat));scanf("%d%d",&v,&e);for(int i=0;i<e;i++){scanf("%d%d%d",&a,&b,&c);if(c<mat[a][b]){mat[a][b]=c;mat[b][a]=c;}}for(int i=1;i<=v;i++){scanf("%d",&d);mat[i][v+1]=d;//把外界设施也当成楼,输入费用 }prim(v+1);}return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 当兵中途不想当了怎么办 当兵后不想当了怎么办 在泰国想剪头发怎么办 省二证书丢了怎么办 职称计算机级别报错怎么办 科一不会用电脑怎么办 西安科目三挂了怎么办 我有c照想考a照怎么办 叉车证单位不给怎么办 刚练科目三害怕怎么办 摩托科目一考不过怎么办 人老了视力不好怎么办 2岁宝宝视力不好怎么办 唱歌音总是唱不准怎么办 考级没地方练琴怎么办 少儿声乐唱不准音该怎么办 学历认证报告编号忘记了怎么办 自考挂科10门了怎么办 高中的会考没过怎么办 毕业证和学位证丢了怎么办 大学毕业证学位证丢了怎么办 大学毕业证和学位证丢了怎么办 毕业证是士官证号码怎么办 自考本科准考证丢了怎么办 自考档案搞丢了怎么办 自考本科档案在自己手里怎么办? 本科自考准考证丢了怎么办 大学团员证丢了怎么办 大学开学团员证丢了怎么办 研究生开学没有团员证怎么办 研究生开学已经不是团员了怎么办 毕业了要搬宿舍怎么办 中专学历认证已停止怎么办 中专不做学历认证考试怎么办 大学生欠学费被扣毕业证怎么办 考警校体检没过怎么办 美国签证申请预约名字写错怎么办 当兵不从学校走怎么办 门牙崩了一小块怎么办 遇到很难过的事情怎么办 小孩子上课精力不集中怎么办