• 南阳38--布线问题


    布线问题

    时间限制: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
    ", sum);
    65     }
    66     return 0;
    67 }         
  • 相关阅读:
    v-distpicker 一个好用的三级联动的插件
    截取url参数
    position: relative 和 position: absoution 的详解
    自己封装一个下拉列表
    临界区访问的两个类:临界区类,共享临界区类——多平台版本
    临界区访问的两个类:临界区类,共享临界区类
    beyond compare 4.2.9桌面右键集成的问题修复
    递归创建、删除目录的几个函数
    读取资源中的GIF文件相应像素宽高度
    在关于对话框中,自动获取当前程序的版本,以显示
  • 原文地址:https://www.cnblogs.com/soTired/p/4729140.html
Copyright © 2020-2023  润新知