HDU 1233 还是畅通工程

HDU 1233 还是畅通工程

HDU 1233 还是畅通工程
题目意思就是给你一个有n个点的图,给出n *(n-1)/ 2 条边的信息,包括边的端点和边的长度,要求
在满足所有点在同一个连通分支上的前提下,选择最短的道路来修建。典型的最小生成树算法,同样,问题
规模不大,直接矩阵就可以胜任。
 1  #include < stdlib.h >
 2  #include < stdio.h >
 3  #include < string .h >  
 4 
 5  const   int  MAX  =   100000000 ;
 6  int  map[ 101 ][ 101 ], MIN, sum;
 7  //  map[i][j] 记录从点 i 到点 j 的距离 ! 
 8 
 9  int  main()
10  {
11       int  n, x, y, m, v[ 101 ], flag, dis;
12       while  (scanf( " %d " & n), n)
13      {
14            map[n][n];
15            memset(map,  0 sizeof (map)); // 数组清零 
16            m  =  (n * (n - 1 )) / 2 ;
17             for  ( int  i = 0 ; i < m; i ++ )
18            {  // 输入并处理边的信息 
19                scanf( " %d %d %d " & x,  & y,  & dis);
20               map[x - 1 ][y - 1 =  map[y - 1 ][x - 1 =  dis;
21            }
22             for  ( int  i = 0 ; i < n; i ++ )map[i][i]  =  MAX;
23             // 建图完成 !
24            v[n];
25            memset(v,  0 sizeof (v));
26            v[ 0 =   1 ;
27            sum  =   0
28             for  ( int  i = 1 ; i < n; i ++ )
29            { // prim 算法求最小生成树 
30                MIN  =   10000000
31                 for  ( int  j = 0 ; j < n; j ++ )
32                {
33                     if  ( ! v[j]  &&  map[ 0 ][j]  <  MIN)
34                    {
35                       MIN  =  map[ 0 ][j];
36                       flag  =  j;
37                    }
38                }
39                sum  +=  MIN; 
40                v[flag]  =   1 ;
41                 for  ( int  j = 0 ; j < n; j ++ )
42                {
43                     if  ( ! v[j]  &&  map[ 0 ][j]  >  map[flag][j])
44                    {
45                       map[ 0 ][j]  =  map[flag][j];
46                    }
47                }
48            }
49            printf( " %d\n " ,sum);
50      }
51       return   0 ;
52  }
53 


你可能感兴趣的:(HDU 1233 还是畅通工程)