• A


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

    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
    
    
            
     
    Huge input, scanf is recommended.

    解题思路:最小生成树的问题,我使用的使Kruskal的算法

     1 #include <iostream>
     2 #include <queue>
     3 #include <string.h>
     4 #include <stdio.h>
     5 using namespace std;
     6 
     7 const int MAX = 100 + 20;
     8 int N;
     9 int visit[MAX];
    10 
    11 struct len
    12 {
    13     int a;
    14     int b;
    15     int len0;
    16 };
    17 
    18 struct cmp
    19 {
    20     bool operator() ( len x,len y)
    21     {
    22         return x.len0 > y.len0;
    23     }
    24 };
    25 
    26 int Find(int x)
    27 {
    28     if(visit[x]==x)
    29         return x;
    30     else
    31         return visit[x] = Find(visit[x]);
    32 }
    33 
    34 int mix(int x,int y)
    35 {
    36     int TT = 0;
    37     int Tx = Find(x);
    38     int Ty = Find(y);
    39     if(Tx!=Ty)
    40     {
    41         visit[Tx] = Ty;
    42         TT = 1;
    43     }
    44     return TT;
    45 
    46 }
    47 
    48 int main()
    49 {
    50 
    51     while(cin>>N)
    52     {
    53         if(N==0)
    54             break;
    55 
    56         priority_queue<len,vector<len>,cmp>P;
    57         for(int i = 1;i <=N;i++)
    58             visit[i] = i;
    59 
    60         for(int i = 1;i <= N*(N-1)/2;i++ )
    61         {
    62             len temp;
    63             scanf("%d %d %d",&temp.a,&temp.b,&temp.len0);
    64             P.push(temp);
    65         }
    66 
    67         int sum = 0;
    68         for(int i = 1;i <=N*(N-1)/2;i++ )
    69         {
    70             len temp = P.top();
    71             P.pop();
    72 
    73             if(mix(temp.a,temp.b)==1)
    74             {
    75                 sum += temp.len0;
    76             }
    77         }
    78         cout<<sum<<endl;
    79 
    80     }
    81 
    82 
    83     return 0;
    84 }



  • 相关阅读:
    ***EF中的问题(复习的同学可略过)
    课堂练习
    MVC-07 案例2
    MVC-06 安装部署
    MVC-05 Model(2)
    MVC-05 Model(1)
    MVC-04 视图(3)
    Learning Web
    MVC-04 视图(2)
    hdu 1272 并查集
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7294129.html
Copyright © 2020-2023  润新知