poj 3026 Borg Maze 最小生成树+bfs
来源:互联网 发布:apache httpd安装配置 编辑:程序博客网 时间:2024/05/16 16:00
poj 3026 Borg Maze
http://poj.org/problem?id=3026
从S点开始,可以出发任意多人开始走,走的相同的路只算一个人的路程,人只能在A点与S点处分开,求S点开始遍历所有A点所经过的最小路程
注意m与n后可能有空格,不能用getchar,要用gets………………
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int INF= 0x3f3f3f3f;char mit[60][60];int n, m, tot, vis[60][60], dis[110][110];int mp[110];int mov[4][2]={1, 0, 0, 1, -1, 0, 0, -1};int link[110], visc[110];struct node{ int x, y, d;};void init(){ int i, j, k; scanf("%d%d", &n, &m); gets(mit[0]); for( i=0; i<m; i++) gets(mit[i]); memset( dis, 0, sizeof( dis)); memset( mp, 0, sizeof( mp)); for( i=1, tot=1; i<m-1; i++){ for( j=1; j<n-1; j++) if( mit[i][j] == 'S' || mit[i][j]== 'A'){ mp[(i-1)*(n-2)+j]= tot++; //cout<<(i-1)*(n-2)+j<<" "<<tot<<endl; } }}bool check(int x, int y){ if( x>=1 && x<m && y>=1 && y<n && mit[x][y]!= '#' && !vis[x][y]) return true; else return false;}void bfs(int sx, int sy){ int i, j, k; node start, head, next; queue <node > q; memset( vis, 0, sizeof( vis)); start.x= sx; start.y= sy; start.d= 0; q.push(start); vis[start.x][start.y]= 1; while( !q.empty()){ head= q.front(); q.pop(); if( mit[head.x][head.y] == 'A' || mit[head.x][head.y]== 'S'){ dis[mp[(head.x-1)*(n-2) + head.y]][mp[(sx-1)*(n-2)+ sy]]= head.d; // cout<<mp[(head.x-1)*(n-2) + head.y]<<" "<<mp[(sx-1)*(n-2)+ sy]<<" "<<head.d<<" ddd"<<endl; } next.d= head.d+1; for( i=0; i<4; i++){ next.x= head.x+ mov[i][0]; next.y= head.y+ mov[i][1]; if( check(next.x , next.y)){ vis[next.x][next.y]= 1; q.push(next); } } }}int road(){ int i, j, k, t, tmp, num, cnt= (m-2)*(n-2); memset( link, 0, sizeof(link)); tot--; for( i=1; i<=tot; i++){ link[i]= dis[1][i]; // cout<<link[i]<<" "; } link[1]= 0; visc[1]= 1; link[1]= 0; num= 0; for( i=1; i<tot; i++){ t= INF; for( j=1; j<=tot; j++){ if( !visc[j] && link[j]< t){ tmp= j; t= link[j]; } } visc[tmp]= 1; num+= t; for( j=1; j<=tot; j++){ if( !visc[j] && link[j] > dis[tmp][j]) link[j]= dis[tmp][j]; } } return num;}int main(){ // freopen("1.txt", "r", stdin); int i, j, k, T; scanf("%d", &T); while( T--){ init(); for( i=1; i<m-1; i++){ for( j=1; j<n-1; j++) if( mit[i][j] == 'S' || mit[i][j]== 'A'){ bfs( i, j); } } memset( visc, 0, sizeof( visc)); printf("%d\n", road()); } return 0;}
- poj 3026 Borg Maze 最小生成树+bfs
- POJ 3026 Borg Maze bfs + 最小生成树
- poj 3026 Borg Maze bfs建图+最小生成树
- poj 3026 Borg Maze (bfs+最小生成树)
- POJ 3026 Borg Maze【BFS+最小生成树】
- POJ 3026 Borg Maze (最小生成树 + BFS)
- POJ 3026 Borg Maze(BFS+最小生成树)
- poj 3026 Borg Maze (bfs + 最小生成树)
- POJ 3026 Borg Maze (bfs+最小生成树)
- poj 3026 Borg Maze bfs+最小生成树
- POJ 3026 —— Borg Maze BFS + 最小生成树
- poj 3026 Borg Maze(BFS+最小生成树)
- POJ 3026 Borg Maze bfs + 最小生成树
- POJ 3026 Borg Maze(bfs+最小生成树-Prim)
- poj-3026 Borg Maze BFS+最小生成树
- POJ 3026 Borg Maze(最小生成树--prime+BFS)
- POJ 3026 Borg Maze(BFS+最小生成树)
- POJ 3026 Borg Maze【BFS+最小生成树MST】
- Enjoy everyday(3)——大雨
- 2399:GPA
- 深入理解 指针函数与函数指针
- 用vec类型变量构造Mat(解决一个问题)
- POJ 3468 A Simple Problem with Integers
- poj 3026 Borg Maze 最小生成树+bfs
- cocos2d-x 2.0 动画的创建(利用swf创建动画)
- JavaBean与表单
- MakeFile 详解
- lua调用
- Android – 多屏幕适配相关
- UIApplication详解
- 安装和使用memcached
- 基础-AS3数据类型