布线问题
时间限制: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开始),由于安全问题,只能选择一个楼连接到外界供电设备。
数据保证至少存在一种方案满足要求。 - 输出
- 每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
- 样例输入
-
1 4 6 1 2 10 2 3 10 3 1 10 1 4 1 2 4 1 3 4 1 1 3 5 6
- 样例输出
-
4
1 #include<iostream> 2 #include<algorithm> 3 #define N 502 4 #define M 125000 5 using namespace std; 6 int u[M],v[M],r[M],w[M],p[N]; 7 8 int cmp(const int i,const int j)//间接排序 9 { 10 return w[i]<w[j]; 11 } 12 int find(int x)//并查集函数 13 { 14 return p[x]==x ? x : p[x]=find(p[x]); 15 } 16 17 int main() 18 { 19 int t,n,m,i,s; 20 21 cin>>t; 22 while(t--) 23 { 24 cin>>n>>m; 25 int ans=0; 26 for(i=0;i<m;i++) 27 cin>>u[i]>>v[i]>>w[i]; 28 cin>>s; 29 ans=s; 30 for(i=1;i<n;i++) 31 { 32 cin>>s; 33 if(s<ans) ans=s; 34 } 35 for(i=0;i<n;i++) p[i]=i;//初始化并查集 36 for(i=0;i<m;i++) r[i]=i;//初始化边序号 37 sort(r,r+m,cmp); 38 for(i=0;i<m;i++) 39 { 40 int e=r[i]; int x=find(u[e]); int y=find(v[e]); 41 if(x!=y) 42 { 43 ans+=w[e]; 44 p[x]=y; 45 } 46 } 47 cout<<ans<<endl; 48 } 49 return 0; 50 }