zoukankan      html  css  js  c++  java
  • 畅通工程 HDU

           某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
    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
    书上的模板。。。,正在理解ing
     1 #include<cstdio>
     2 #include<string>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 static const int MAX=105;
     7 static const int INFTY=(1<<21);
     8 static const int WHITE=0;
     9 static const int GRAY=1;
    10 static const int BLACK=2;
    11 
    12 int n,M[MAX][MAX];
    13 int prim()
    14 {   int u,minv;
    15     int d[MAX],color[MAX],p[MAX];
    16     for(int i=1;i<=n;i++)
    17     {   d[i]=INFTY;
    18         color[i]=WHITE;
    19         p[i]=-1;
    20     }
    21     d[1]=0;
    22     while(1)
    23     {   minv=INFTY;
    24         u=-1;
    25         for(int i=1;i<=n;i++)
    26         {   if(minv>d[i]&&color[i]!=BLACK)
    27             {   u=i;
    28                 minv=d[i];
    29             }
    30         }
    31         if(u==-1) break;
    32         color[u]=BLACK;
    33         for(int v=1;v<=n;v++)
    34         {   if(color[v]!=BLACK&&M[u][v]!=INFTY)
    35             {   if(d[v]>M[u][v])
    36                 {   d[v]=M[u][v];
    37                     p[v]=u;
    38                     color[v]=GRAY;
    39                 }
    40             } 
    41         } 
    42     }
    43     int sum=0;
    44     for(int i=1;i<=n;i++)
    45     {   if(p[i]!=-1) sum+=M[i][p[i]];
    46     }
    47     return sum;
    48 }
    49 void init()
    50 {   int i,j;
    51     for(i=1;i<=n;i++)
    52     {   for(j=1;j<=n;j++)
    53         {  M[i][j]=INFTY;
    54         }
    55     }
    56 
    57 }
    58 int main()
    59 {   while(scanf("%d",&n),n!=0)
    60     {  init();
    61        int x,y,v;
    62        for(int j=0;j<(n*(n-1))/2;j++)
    63        {  scanf("%d%d%d",&x,&y,&v);
    64           if(v<M[x][y]) M[x][y]=M[y][x]=v;
    65        }
    66        printf("%d
    ",prim());
    67     }
    68 }
  • 相关阅读:
    Github+Jekyll 搭建个人网站详细教程
    github发布博客
    如何在GitHub部署自己的个人网站
    VS2017git 提交提示错误 Git failed with a fatal error.
    CAD 二次开发----- 块
    Updates were rejected because the remote contains work that you do(gitee报错解决方案)
    关于错误CSC : error CS0006:未能找到元数据文件
    js 四舍五入
    spingboot 邮件模板发送;
    springboot 邮件
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/6522931.html
Copyright © 2011-2022 走看看