布线问题

来源:互联网 发布:淘宝拍图片要多少钱 编辑:程序博客网 时间: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