HDU 1102 Constructing Roads

很好的最小生成树的模板题,由于用邻接矩阵存储的,故用prim算法比较方便。

AC code:

prim
 1 #include <iostream>
 2 using namespace std;
 3 int n, q, sum;
 4 const int MAX = 101;
 5 const int INF = 100000;
 6 int map[MAX][MAX], vis[MAX], dis[MAX];
 7 
 8 void init()
 9 {
10     int i, j, tx, ty;
11     for(i = 1; i <= n; i++){
12         for(j = 1; j <= n; j++)
13         scanf("%d", &map[i][j]);
14     }
15     scanf("%d", &q);
16     for(i = 1; i <= q; i++){
17         scanf("%d%d", &tx, &ty);
18         map[tx][ty] = 0;
19         map[ty][tx] = 0;
20     }
21 }
22 void prim()
23 {
24     int i, j;
25     sum = 0;
26     memset(vis, 0, sizeof(vis));
27     for(i = 1; i <= n; i++)
28         dis[i] = INF;
29     dis[1] = 0;
30     for(i = 1; i <= n; i++){
31         int min = INF, pos = -1;
32         for(j = 1; j <= n; j++){
33             if(dis[j] < min && !vis[j]){
34                 min = dis[j];
35                 pos = j;
36             }
37         }
38         vis[pos] = 1;
39         sum += min;
40         for(j = 1; j <= n; j++){
41             if(map[pos][j] < dis[j])
42                 dis[j] = map[pos][j];
43         }
44     }
45 }
46 int main()
47 {
48     while(scanf("%d", &n) != EOF)
49     {
50          init();
51          prim();
52          printf("%d\n", sum);
53     }
54     return 0;
55 }
posted @ 2012-04-20 11:17  背着超人飞  阅读(160)  评论(0)    收藏  举报