布线问题

时间限制: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  
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm> 
 6 int father[550], num[550];
 7 using namespace std;
 8 int n, m;
 9 struct rode
10 {
11     int a, b, w;
12 } nm[500*250];
13 
14 bool cmp(rode a, rode b)
15 {
16     return a.w < b.w; 
17 } 
18 
19 void init()
20 {
21     for(int i = 1; i <= n; i++)
22         father[i] = i;
23 }
24 
25 int find(int a)
26 {
27     while(a != father[a])
28         a = father[a];
29     return a;
30 }
31 
32 bool mercy(int a, int b)
33 {
34     int q = find(a);
35     int p = find(b);
36     if(q != p)
37     {
38         father[q] = p;
39         return true;
40     }
41     else
42         return false;
43 }
44 
45 int main()
46 {
47     int t;
48     scanf("%d", &t);
49     while(t--){
50     //    int n, m;
51         scanf("%d %d", &n, &m);
52         init();
53         int sum = 0;
54         for(int i = 0; i < m; i++)            
55             scanf("%d %d %d", &nm[i].a, &nm[i].b, &nm[i].w);
56         sort(nm, nm+m, cmp);
57         for(int i = 0; i < m; i++)
58             if(mercy(nm[i].a, nm[i].b))
59                 sum += nm[i].w;
60         for(int i = 0; i < n; i++)
61             scanf("%d", &num[i]);
62         sort(num, num+n);
63             sum += num[0];
64         printf("%d\n", sum);
65     }
66     return 0;
67 }         

 

posted on 2015-08-14 09:59  cleverbiger  阅读(207)  评论(0编辑  收藏  举报