布线问题
来源:互联网 发布:淘宝拍图片要多少钱 编辑:程序博客网 时间:2024/04/29 18:50
布线问题
时间限制: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
- 来源
- [张云聪]原创
- 上传者
张云聪
思路:
最小生成树。。还有是不能用这种格式,不然会一直Wa个不停。。。
struct node{int l,r,w;friend bool operator<(node a,const node b){return a.w<b.w;}}g[150000];
ac代码:
#include <stdio.h>#include<algorithm>using namespace std;typedef long long ll;#define CRL(a) memset(a,0,sizeof(a))#define T 505#define INF 0x3fffffffint bo[T];struct node{int l,r,w;}g[150000];bool cmp(node a,node b){return a.w<b.w; }int Find(int f){if(bo[f]!=f) bo[f]=Find(bo[f]);return bo[f];}int main(){/*freopen("input.txt","r",stdin);*/int N,n,m,s,mi,i,x,y;scanf("%d",&N);while(N--){mi=INF;s=0;scanf("%d%d",&n,&m);for(i=1;i<=m;++i)bo[i]=i;for(i=0;i<m;++i)scanf("%d%d%d",&g[i].l,&g[i].r,&g[i].w);for(i=0;i<n;++i){scanf("%d",&x);if(x<mi)mi=x;}sort(g,g+m,cmp);for(i=0;i<m;++i){x=Find(g[i].l);y=Find(g[i].r);if(x!=y){bo[x]=y;s+=g[i].w;}}printf("%d\n",s+mi);}return 0;}
优秀代码:#include<queue>#include<iostream>#include<cstring>#include<cstdio>#include<numeric>#include<algorithm>using namespace std;#define CLR(arr,val) memset(arr,val,sizeof(arr))struct Node{Node(){}Node(int num,int len):len(len),num(num){}int len,num;};bool operator<(const Node& n1,const Node& n2){return n1.len>n2.len;}const int MAX=510;const int MAXE=250000;int Head[MAX],Next[MAXE],Num[MAXE],Len[MAXE];int Dis[MAX],top;void add(int u,int v,int len){Num[top]=v;Next[top]=Head[u];Len[top]=len;Head[u]=top++;}bool InQ[MAX];int main(){//freopen("input.txt","r",stdin);priority_queue<Node> q;int t,m,n,a,b,l;scanf("%d",&t);while(t--){top=0;CLR(Head,-1);CLR(Dis,0x3f);scanf("%d%d",&m,&n);for(int i=0;i!=n;i++){scanf("%d%d%d",&a,&b,&l);add(a-1,b-1,l);add(b-1,a-1,l);}Dis[0]=0;q.push(Node(0,0));while(!q.empty()){Node t=q.top();q.pop();if(Dis[t.num]!=t.len) continue;for(int i=Head[t.num];i!=-1;i=Next[i]){if(Dis[Num[i]]>Len[i]){Dis[Num[i]]=Len[i];q.push(Node(Num[i],Len[i]));}}}int minl=0x3f3f3f3f;for(int i=0;i!=m;i++){scanf("%d",&l);minl=min(minl,l);}printf("%d\n",accumulate(Dis,Dis+m,0)+minl);}}
0 0
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- 布线问题
- Oracle行转列和列转行
- KVO实现机制 & 如何自己动手实现 KVO
- 通达OA 小飞鱼工作流在线培训教程(八)常用表单控件
- Opencv 三对角线矩阵(Tridiagonal Matrix)解法之(Thomas Algorithm)
- 频道发布与消息订阅
- 布线问题
- phalapi改动的地方
- Effective C++ 改善程序与设计的55个具体做法 二周目笔记01
- sass 安装使用杂记
- MVC之单个信函打印
- Warez出品的精品动画,近25万倍的压缩,大小仅有64K的
- 树中走N步求获得的最大金币数 树形DP SRM 666 div2 problem999
- 关于Android开发中Java对象序列化的一次测试
- Stretch Key Dimensions to See What Breaks