HDU 1233 还是畅通工程

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

 

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
 
//最小生成树 Prim算法
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std ;
int
main ()
{

    int
p [ 103 ][ 103 ],l [ 103 ];
    int
n ,m ,i ,j ,x ,y ,sum ;
    while
(scanf ( "%d" ,&n ),n )
    {
   m =(n - 1 )*n ;
        m =(m >> 1 );
        memset (l , 0 , sizeof (l ));
        for
(i = 0 ;i <m ;i ++)
        {

          scanf ( "%d%d%d" ,&x ,&y ,&sum );
          p [x ][y ]=p [y ][x ]=sum ;
        }


      sum = 0 ;
      l [ 1 ]= 1 ;
      x =n - 1 ;
      while
(x --)//这里就是我学的prim算法基本模板了!
      {
     y = 9999999 ;
       for
(i = 2 ;i <=n ;i ++)
         {

            if
(!l [i ]&&p [ 1 ][i ]<y )
             {

               j =i ;
               y =p [ 1 ][i ];
             }
         }

        sum +=y ;
        l [j ]= 1 ;
        for
(i = 2 ;i <=n ;i ++)
          if
(!l [i ]&&p [i ][j ]<p [ 1 ][i ])
             p [ 1 ][i ]=p [i ][j ];

    }

    printf ( "%d\n" ,sum );
   }

    return
0 ;
}

你可能感兴趣的:(HDU)