zoukankan      html  css  js  c++  java
  • HDU 1233

    Description

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

    Input

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

    Output

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

    Sample Input

    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
    

      

     

    Sample Output

    3 5

    Hint

    Hint  Huge input, scanf is recommended.
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #define LL long long
     5 using namespace std;
     6 
     7 const int MAX = 5000;
     8 
     9 int vis[128];
    10 struct POINT{
    11     int a, b, s;
    12 };
    13 
    14 
    15 int Find(int a)
    16 {
    17     if(a != vis[a])
    18         vis[a] = Find(vis[a]);
    19     return vis[a];
    20 }
    21 bool Union(int a, int b)
    22 {
    23     int aa = Find(a), bb = Find(b);
    24     if(aa == bb)
    25     {
    26         return false;
    27     }
    28     vis[bb] = aa;
    29     return true;
    30 }
    31 
    32 bool cmp(POINT a, POINT b)
    33 {
    34     return a.s < b.s;
    35 }
    36 
    37 POINT arr[5000];
    38 
    39 int main()
    40 {
    41 #ifdef CDZSC_OFFLINE
    42     freopen("in.txt", "r", stdin);
    43     freopen("out.txt", "w", stdout);
    44 #endif
    45     int n, m;
    46     LL sum;
    47     while(~scanf("%d", &n) && n)
    48     {
    49         m = (n * (n - 1)) >> 1;
    50         memset(arr, 0, sizeof(arr));
    51         for(int i = 0; i < 128; i++)
    52         {
    53             vis[i] = i;
    54         }
    55         for(int i = 0; i < m; i++)
    56         {
    57             scanf("%d%d%d", &arr[i].a, &arr[i].b, &arr[i].s);
    58         }
    59         sort(arr, arr + m, cmp);
    60         sum = 0;
    61         for(int i = 0; i < m; i++)
    62         {
    63             if(Union(arr[i].a, arr[i].b))
    64             {
    65                 sum += arr[i].s;
    66             }
    67         }
    68         printf("%I64d
    ", sum);
    69     }
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    02-最简C语言程序
    Go学习笔记-GO编程语言手册
    Go学习笔记-Effective Go
    go学习笔记-语法
    机器学习-数据挖掘
    windows下jupyter notebook的安装及配置
    wpf学习笔记
    windows下安装mingW及控制台启用
    nginx
    MFC学习笔记
  • 原文地址:https://www.cnblogs.com/LiuACG/p/4271087.html
Copyright © 2011-2022 走看看