标签:
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
题解:反正我是看不懂题意,别人说的啊。求S到全部A的距离和的最小值,这就是传说中的最小生成树了。当然,需要求出两点之间的最短距离。
普利姆:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int INF = 0x3fffffff; struct Node { int x; int y; int d; Node(int a,int b,int c) { x = a; y = b; d = c; } }; char map[100][100]; //字符 bool visited[100][100]; //判断访问过没有 int cnt[100][100]; //记录该坐标的编号(A和S才有编号) int d[2555][2555]; //点之间的距离 int di[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; bool visit[2555]; //普利姆用 int d2[2555]; int res; void bfs(int x,int y,int n,int m) { memset(visited,false,sizeof(visited)); queue<Node> q; q.push(Node(x,y,0)); visited[x][y] = true; d[cnt[x][y]][cnt[x][y]] = 0; while(!q.empty()) { Node p = q.front(); q.pop(); for(int i = 0; i < 4;i++) { int xx = p.x + di[i][0]; int yy = p.y + di[i][1]; if(xx >= 0 && xx < n && yy >= 0 && yy < m) { if(visited[xx][yy]) { continue; } if(map[xx][yy] == '#') { continue; } if(cnt[xx][yy] != -1) d[cnt[x][y]][cnt[xx][yy]] = p.d + 1; q.push(Node(xx,yy,p.d + 1)); visited[xx][yy] = true; } } } } void prim(int n) { memset(visit,false,sizeof(visit)); res = 0; for(int i = 0;i < n;i++) { d2[i] = d[0][i]; } d2[0] = 0; visit[0] = true; for(int i = 1;i < n;i++) { int min = 1000000000; int k; for(int j = 0;j < n;j++) { if(!visit[j] && min > d2[j]) { min = d2[j]; k = j; } } res += min; visit[k] = true; for(int j = 0;j < n;j++) { if(!visit[j] && d2[j] > d[k][j]) { d2[j] = d[k][j]; } } } } int main() { int ncase; cin>>ncase; char s[30]; while(ncase--) { int m,n; scanf("%d%d",&m,&n); gets(s); for(int i = 0;i < n;i++) { for(int j = 0;j < m;j++) { scanf("%c",&map[i][j]); } getchar(); } memset(cnt,-1,sizeof(cnt)); int k = 0; for(int i = 0;i < n;i++) { for(int j = 0;j < m;j++) { if(map[i][j] == 'A' || map[i][j] == 'S') { cnt[i][j] = k++; //编号,0开始 } } } for(int i = 0;i < n;i++) { for(int j = 0;j < m;j++) { if(cnt[i][j] != -1) { bfs(i,j,n,m); //从每一点开始找到其他点的最短距离 } } } prim(k); printf("%d\n",res); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wang2534499/article/details/47790149