HDU 1102 Constructing Roads

HDU 1102 Constructing Roads

HDU 1102 Constructing Roads

这个题目的意思就是说,给你一个有n个村庄的地图,map[i][j]表示从村庄 i 到村庄 j 的距离,然后给你
m 条已有道路,让你在这个基础上添加适当的道路,使得所有村庄之间都是联通的,求添加道路的最短距
离的值。 典型的最小生成树算法的运用。
 1  #include < stdio.h >
 2  #include < stdlib.h >
 3  #include < string .h >
 4 
 5  const   int  MAX  =   0x7fffffff
 6  int  map[ 101 ][ 101 ], v[ 101 ], x, y, n, sum, flag, min;
 7 
 8  void  Reset( int  n)
 9  { // 根据 规模  n 的大小  ,建立 map! 
10        for  ( int  i = 0 ; i < n; i ++ )
11       {
12            for  ( int  j = 0 ; j < n; j ++ )
13           {
14               scanf( " %d " & map[i][j]);
15                if  (i  ==  j)map[i][j]  =   0 ;
16           }
17       }
18        int  m;
19       scanf( " %d " & m);
20        for  ( int  i = 0 ; i < m; i ++ )
21       {
22           scanf( " %d %d " & x,  & y);
23           map[x - 1 ][y - 1 =  map[y - 1 ][x - 1 =   0 ;
24       }
25  }
26  void  MinTree()
27  { //  最小生成树算法 
28       memset(v,  0 sizeof (v));
29       v[ 0 =   1 ;
30       sum  =   0 ;
31        for  ( int  i = 1 ; i < n; i ++ )
32       {
33           min  =  MAX;
34            for  ( int  j = 0 ; j < n; j ++ )
35           {
36                if  ( ! v[j]  &&  map[ 0 ][j]  <  min) 
37               {
38                  min  =  map[ 0 ][j], flag  =  j;
39               }
40           }
41           v[flag]  =   1 ;
42           sum  +=  min;
43            for  ( int  j = 0 ; j < n; j ++ )
44           {
45                if  ( ! v[j]  &&  map[ 0 ][j]  >  map[flag][j])
46               {
47                  map[ 0 ][j]  =  map[flag][j];
48               }
49           }
50       }
51       printf( " %d\n " , sum);
52  }
53 
54  int  main()
55  {
56       while  (scanf( " %d " & n)  !=  EOF)
57      {
58            Reset(n);
59            MinTree();
60      }
61       return   0 ;
62  }





你可能感兴趣的:(HDU 1102 Constructing Roads)