问题: 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); } ; }