码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3026 最小生成树

时间:2014-07-03 23:17:55      阅读:362      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   问题   

问题: POJ3026

分析:

采用BFS算出两两之间的距离,再用PRIM算法计算最小生成树。

AC代码:

  1 //Memory: 220K        Time: 32MS
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <string>
  5 #include <cstring>
  6 #include <queue>
  7 
  8 using namespace std;
  9 
 10 const int maxn = 52;
 11 const int max_alien = 101;
 12 char maze[maxn][maxn];
 13 int m[maxn][maxn];
 14 int g[max_alien][max_alien];
 15 int vis[maxn][maxn];
 16 int v[max_alien + 1];
 17 int d[max_alien + 1];
 18 int alien;
 19 int test, x, y;
 20 int si[max_alien + 1], sj[max_alien + 1];
 21 int step[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
 22 
 23 struct node
 24 {
 25     int i;
 26     int j;
 27     int d;
 28     void set(int ii, int jj)
 29     {
 30         i = ii;
 31         j = jj;
 32         d = 0;
 33     }
 34 }n1, n2;
 35 
 36 queue<struct node> q;
 37 
 38 void bfs(int num, int i, int j)
 39 {
 40     memset(vis, 0, sizeof(vis));
 41     int t = alien - num;
 42     while ( !q.empty() ) q.pop();
 43     n1.set(i, j);
 44     q.push(n1);
 45 
 46     while ( !q.empty() && t > 0 ){
 47         n1 = q.front();
 48         q.pop();
 49 
 50         for (int i = 0; i < 4; i++){
 51             n2.set(n1.i + step[i][0], n1.j + step[i][1]);
 52             /*if (n2.i < 0 || n2.j < 0 ||)*/
 53             if (maze[n2.i][n2.j] == # || vis[n2.i][n2.j]) continue;
 54             
 55             vis[n2.i][n2.j] = 1;
 56             n2.d = n1.d + 1;
 57 
 58             if (m[n2.i][n2.j] > num){
 59                 t--;
 60                 g[num][ m[n2.i][n2.j] ] = g[ m[n2.i][n2.j] ][num] = n2.d;
 61             }
 62 
 63             q.push(n2);
 64         }
 65     }
 66     
 67 }
 68 
 69 int prim()
 70 {
 71     memset(v, 0, sizeof(v));
 72     v[0] = 1;
 73     int ret = 0;
 74     for (int i = 1; i <= alien; i++)
 75         d[i] = g[0][i];
 76 
 77     for (int i = 0; i < alien; i++) {
 78 
 79         int _min = 3000, ix;
 80         for (int j = 1; j <= alien; j++) {
 81             if ( !v[j] && d[j] < _min){
 82                 _min = d[j];
 83                 ix = j;
 84             }
 85         }
 86         v[ix] = 1;
 87         ret += d[ix];
 88 
 89         for (int j = 1; j <= alien; j++){
 90             if (!v[j] && d[j] > g[ix][j])
 91                 d[j] = g[ix][j];
 92         }
 93     }
 94     return ret;
 95 }
 96 
 97 int main()
 98 {
 99     scanf("%d", &test);
100     while (test--){
101         memset(m, 0, sizeof(m));
102         scanf("%d%d", &x, &y);
103         gets(maze[0]);
104         alien = 0;
105         for (int i = 0; i < y; i++)
106             gets(maze[i]);
107         for (int i = 0; i < y; i++){
108             for (int j = 0; j < x; j++){
109                 if (maze[i][j] == S){
110                     si[0] = i; 
111                     sj[0] = j;
112                 }
113                 else if (maze[i][j] == A) {
114                     m[i][j] = ++alien;
115                     si[alien] = i;
116                     sj[alien] = j;
117                 }
118             }
119         }
120 
121         memset(g, 0, sizeof(g));
122         for (int i = 0; i <= alien; i++){
123             bfs(i, si[i], sj[i]);
124         }
125 
126         int ans = prim();
127 
128         printf("%d\n", ans);
129     }
130     return 0;
131 }

 

 

POJ3026 最小生成树,布布扣,bubuko.com

POJ3026 最小生成树

标签:style   blog   http   color   os   问题   

原文地址:http://www.cnblogs.com/junxie/p/3820686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!