标签:
http://poj.org/problem?id=3026
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
最小生成树问题,但较不同点的是没有给原图,所以要用BFS找各个字母之间的距离,即构成原图
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<queue> #define INF 0x3f3f3f3f #define max(a, b)(a > b ? a : b) #define min(a, b)(a < b ? a : b) #define N 110 using namespace std; struct node { int x, y, step; }; int G[N][N], dist[N], p[N][N];//p记录字母的坐标 bool vis[N], use[N][N]; char maps[N][N]; int m, n, num; int d[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; void Init() { int i, j; memset(p, 0, sizeof(p)); memset(vis, false, sizeof(vis)); for(i = 1 ; i <= num ; i++) { for(j = 1 ; j <= num ; j++) { if(i == j) G[i][j] = 0; else G[i][j] = G[j][i] = INF; } } } int prim(int s)//最小生成树,求最小花费 { int i, j, index, Min, ans = 0; for(i = 1 ; i <= num ; i++) dist[i] = G[s][i]; vis[s] = true; for(i = 1 ; i < num ; i++) { Min = INF; for(j = 1 ; j <= num ; j++) { if(!vis[j] && dist[j] < Min) { Min = dist[j]; index = j; } } ans += Min; vis[index] = true; for(j = 1 ; j <= num ; j++) { if(!vis[j] && dist[j] > G[index][j]) dist[j] = G[index][j]; } } return ans; } void BFS(int x, int y)//广搜构建原图 { queue<node>Q; int i, a, b; node now, next; memset(use, false, sizeof(use)); now.x = x; now.y = y; now.step = 0; use[x][y] = true; Q.push(now); while(!Q.empty()) { now = Q.front(); Q.pop(); if(p[now.x][now.y] > 0)//该点为字母 G[p[x][y]][p[now.x][now.y]] = now.step; for(i = 0 ; i < 4 ; i++) { a = next.x = now.x + d[i][0]; b = next.y = now.y + d[i][1]; if(a >= 0 && a < m && b >= 0 && b < n && !use[a][b] && maps[a][b] != ‘#‘) { next.step = now.step + 1; use[a][b] = true; Q.push(next); } } } } int main() { int i, j, t; scanf("%d", &t); while(t--) { scanf("%d%d ", &n, &m); Init(); num = 0; for(i = 0 ; i < m ; i++) { for(j = 0 ; j < n ; j++) { scanf("%c", &maps[i][j]); } getchar(); } for(i = 0 ; i < m ; i++) { for(j = 0 ; j < n ; j++) { if(maps[i][j] == ‘A‘ || maps[i][j] == ‘S‘) p[i][j] = ++num;//统计字母的个数,即要进入树的点的个数 } } for(i = 0 ; i < m ; i++) { for(j = 0 ; j < n ; j++) if(p[i][j] > 0) BFS(i, j); } printf("%d\n", prim(1)); } return 0; }
poj 3026 Borg Maze (BFS + Prim)
标签:
原文地址:http://www.cnblogs.com/qq2424260747/p/4684913.html