一道"神"坑题 POJ3026 Borg Maze BFS+prim算法

题意不说 附上链接

http://poj.org/problem?id=3026

反正先用BFS搜一遍图 记录 S和A之间的路 用一个二维数组存储

(注意 把每个S或者A 都搜一遍)

好了 剩下的就是赤裸裸的prim了

 

再说"神坑"的地方 

1.必须用gets,这其实倒不必说 

2.在输入n和m后 还要用一个gets —— 测试数据神坑 在n 和 m 后面有一行 "          "

   然后加一个getchar 抵消空格

 

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <string>
  6 #include <iterator>
  7 #include <algorithm>
  8 #include <cstdlib>
  9 #include <deque>
 10 #include <queue>
 11 #include <stack>
 12 #include <map>
 13 #include <vector>
 14 #include <set>
 15 #include <list>
 16 using namespace std;
 17 #define PI acos(-1.0)
 18 #define INF 0x3f3f3f3f
 19 #define MAX 1005
 20 #define MST(a,b) memset(a,b,sizeof(a))
 21 #define MOD 100000007
 22 #define EPS 1e-6
 23 #define pp(a) cout << a << endl;
 24 typedef long long LL;
 25 typedef unsigned long long LLU;
 26 int n,m,k;
 27 char str[MAX],maps[MAX][MAX];
 28 int w[MAX][MAX],dis[MAX],vis[MAX];
 29 int prim() {
 30     MST(vis,0);
 31     for(int i = 0;i < k;i ++) dis[i] = INF;
 32     int ans = 0;
 33     dis[0] = 0;
 34     for(int i = 0;i < k;i ++) {
 35         int tmp = INF,m = 0;
 36         for(int j = 0;j < k;j ++) {
 37             if(!vis[j] && dis[j] < tmp) {
 38                 tmp = dis[j];
 39                 m = j;
 40             }
 41         }
 42         vis[m] = 1;
 43         ans += tmp;
 44         for(int j = 0;j < k;j ++)
 45             if(!vis[j] && dis[j] > w[m][j]) dis[j] = w[m][j];
 46     }
 47     return ans;
 48 }
 49 struct node {
 50     int x,y;
 51     int step;
 52 }pos[MAX];
 53 int vis1[MAX][MAX],number[MAX][MAX];
 54 int check(int x,int y) {
 55     if(vis1[x][y] == 1) return 0;
 56     if(maps[x][y] == '#') return 0;
 57     return 1;
 58 }
 59 int dx[4] = {0,0,1,-1};
 60 int dy[4] = {-1,1,0,0};
 61 void bfs(int num) {
 62     MST(vis1,0);
 63     queue <node> q;
 64     q.push(pos[num]);
 65     pos[num].step = 0;
 66     vis1[pos[num].x][pos[num].y] = 1;
 67     while(!q.empty()) {
 68         node a = q.front();
 69         q.pop();
 70         if(maps[a.x][a.y] == 'A' || maps[a.x][a.y] == 'S') w[num][number[a.x][a.y]] = a.step;
 71         for(int i = 0;i < 4;i ++) {
 72             node b;
 73             b.x = a.x + dx[i];
 74             b.y = a.y + dy[i];
 75             if(check(b.x,b.y)) {
 76                 vis1[b.x][b.y] = 1;
 77                 b.step = a.step + 1;
 78                 q.push(b);
 79             }
 80         }
 81     }
 82 }
 83 int main() {
 84     int cases;
 85     scanf("%d",&cases);
 86     while(cases --) {
 87         k = 0;
 88         scanf("%d%d",&n,&m); gets(str);
 89         getchar();
 90         for(int i = 0;i < m;i ++) {
 91             gets(str);
 92             for(int j = 0;j < n;j ++) {
 93                 maps[i][j] = str[j];
 94                 if(maps[i][j] == 'A' || maps[i][j] == 'S') {
 95                     pos[k].x = i;
 96                     pos[k].y = j;
 97                     number[i][j] = k;
 98                     k ++;
 99                 }
100             }
101         }
102         //bfs(0);
103         for(int i = 0;i < k;i ++) bfs(i);
104         printf("%d\n",prim());
105     }
106     return 0;
107 }

以上

(那种感觉有点熟悉)

转载于:https://www.cnblogs.com/mitrenick/p/3723690.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值