题意不说 附上链接
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 }
以上
(那种感觉有点熟悉)