• 九度oj 题目1017:还是畅通工程


    题目描述:
        某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
    输入:

        测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
        当N为0时,输入结束,该用例不被处理。

    输出:

        对每个测试用例,在1行里输出最小的公路总长度。

    样例输入:
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
    样例输出:
    3
    5

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <string>
     5 #define MAX 102
     6 #define inf 0x3f3f3f3f
     7 int flag[MAX];
     8 int cost[MAX][MAX];
     9 int lowCost[MAX];
    10  
    11 int main(int argc, char const *argv[])
    12 {
    13     int n,m;
    14     scanf("%d",&n);
    15     while(n != 0) {
    16         int count = 0;
    17         m = n * (n-1)/2;
    18         for(int i = 1; i <= n; i++) {
    19             flag[i] = 0;
    20             for(int j = 1; j <= n; j++) {
    21                 cost[i][j] = inf;
    22             }
    23         }
    24         for(int i = 0; i < m; i++) {
    25             int a,b,c,d;
    26             scanf("%d %d %d",&a,&b,&c);
    27              cost[a][b]= cost[b][a] = c;
    28             
    29         }
    30             
    31             int sumCost = 0;
    32             for(int i = 1; i <= n; i++) {
    33                 lowCost[i] = cost[1][i];
    34             }
    35             flag[1] = 1;
    36              
    37             for(int i = 1; i <= n; i++) {
    38                 int min = inf;
    39                 int v = -1;
    40                 for(int i = 1; i <= n; i++) {
    41                     if(flag[i] == 0 && lowCost[i] < min) {
    42                         min = lowCost[i];
    43                         v = i;
    44                     }
    45                 }
    46                 flag[v] = 1;
    47                 sumCost = sumCost + lowCost[v];
    48  
    49                 for(int i = 1; i <= n; i++) {
    50                     if(cost[v][i] < lowCost[i]) {
    51                         lowCost[i] = cost[v][i];
    52                     }
    53                 }
    54             }
    55  
    56             printf("%d
    ",sumCost);
    57          
    58         scanf("%d",&n);
    59     }
    60  
    61     return 0;
    62 }
  • 相关阅读:
    Makefile编写基础知识总结
    Linux开发基础篇开发环境搭建
    较常用的Linux 命令技巧
    Linux socket实现非阻塞型通信
    VirtualBox linux 挂载共享Windows文件夹
    Struts2 注解基础
    DB2 Error Code: 1218, SQL State: 57011
    半小时内使用vim的常用命令,以及平时使用的感慨
    vim的一些配置。
    link的属性media的用处
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5678482.html
Copyright © 2020-2023  润新知