POJ3026 最小生成树

时间:2023-03-08 23:31:11
POJ3026 最小生成树

问题: POJ3026

分析:

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

AC代码:

 //Memory: 220K        Time: 32MS
 #include <iostream>
 #include <cstdio>
 #include <string>
 #include <cstring>
 #include <queue>

 using namespace std;

 ;
 ;
 char maze[maxn][maxn];
 int m[maxn][maxn];
 int g[max_alien][max_alien];
 int vis[maxn][maxn];
 ];
 ];
 int alien;
 int test, x, y;
 ], sj[max_alien + ];
 ][] = {{, }, {, -}, {, }, {-, }};

 struct node
 {
     int i;
     int j;
     int d;
     void set(int ii, int jj)
     {
         i = ii;
         j = jj;
         d = ;
     }
 }n1, n2;

 queue<struct node> q;

 void bfs(int num, int i, int j)
 {
     memset(vis, , sizeof(vis));
     int t = alien - num;
     while ( !q.empty() ) q.pop();
     n1.set(i, j);
     q.push(n1);

      ){
         n1 = q.front();
         q.pop();

         ; i < ; i++){
             n2.], n1.j + step[i][]);
             /*if (n2.i < 0 || n2.j < 0 ||)*/
             if (maze[n2.i][n2.j] == '#' || vis[n2.i][n2.j]) continue;

             vis[n2.i][n2.j] = ;
             n2.d = n1.d + ;

             if (m[n2.i][n2.j] > num){
                 t--;
                 g[num][ m[n2.i][n2.j] ] = g[ m[n2.i][n2.j] ][num] = n2.d;
             }

             q.push(n2);
         }
     }

 }

 int prim()
 {
     memset(v, , sizeof(v));
     v[] = ;
     ;
     ; i <= alien; i++)
         d[i] = g[][i];

     ; i < alien; i++) {

         , ix;
         ; j <= alien; j++) {
             if ( !v[j] && d[j] < _min){
                 _min = d[j];
                 ix = j;
             }
         }
         v[ix] = ;
         ret += d[ix];

         ; j <= alien; j++){
             if (!v[j] && d[j] > g[ix][j])
                 d[j] = g[ix][j];
         }
     }
     return ret;
 }

 int main()
 {
     scanf("%d", &test);
     while (test--){
         memset(m, , sizeof(m));
         scanf("%d%d", &x, &y);
         gets(maze[]);
         alien = ;
         ; i < y; i++)
             gets(maze[i]);
         ; i < y; i++){
             ; j < x; j++){
                 if (maze[i][j] == 'S'){
                     si[] = i;
                     sj[] = j;
                 }
                 else if (maze[i][j] == 'A') {
                     m[i][j] = ++alien;
                     si[alien] = i;
                     sj[alien] = j;
                 }
             }
         }

         memset(g, , sizeof(g));
         ; i <= alien; i++){
             bfs(i, si[i], sj[i]);
         }

         int ans = prim();

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