POJ 3026.Borg Maze
来源:互联网 发布:源美网络 半价商城 编辑:程序博客网 时间:2024/06/14 10:50
题目:http://poj.org/problem?id=3026
AC代码(C++):
#include <iostream>#include <algorithm>#include <stdio.h>#include <vector>#include <queue>#include <math.h>#include <string>#include <string.h>#include <bitset>#define INF 0xfffffff#define MAXN 55using namespace std;struct POINT{int x,y;int step;}from,to;int n;int x,y;char g[MAXN][MAXN];int map[MAXN*2][MAXN*2];int dis[MAXN*2];bool vis[MAXN*2];int xy[MAXN][MAXN];bool vist[MAXN][MAXN];int dirx[4] = {0,1,0,-1};int diry[4] = {1,0,-1,0};void bfs(int sx, int sy) {queue<POINT> q;memset(vist, false, sizeof(vist));POINT ss;ss.x = sx;ss.y = sy;ss.step = 0;vist[sx][sy] = true;q.push(ss);while (!q.empty()) {from = q.front();q.pop();if(g[from.y][from.x]=='A'||g[from.y][from.x]=='S')map[xy[from.x][from.y]][xy[sx][sy]] = map[xy[sx][sy]][xy[from.x][from.y]] = from.step;for(int i = 0; i < 4; i++){to.x = from.x + dirx[i];to.y = from.y + diry[i];if (vist[to.x][to.y] == false && g[to.y][to.x] != '#') {vist[to.x][to.y] = true;to.step = from.step + 1;q.push(to);}}}}int Prim(){ int ans = 0; for(int i=0;i<n;i++)dis[i]=map[0][i]; memset(vis,false,sizeof(vis)); vis[0]=1; for(int i=1;i<n;i++){ int next,tmp = INF; for(int j=0;j<n;j++){ if(!vis[j]&&tmp>dis[j]){ tmp=dis[j]; next=j; } } ans += tmp; vis[next]=1; for(int j=0;j<n;j++){ if(!vis[j]&&dis[j]>map[next][j]) dis[j]=map[next][j]; } } return ans;}int main(){int t;scanf("%d",&t);for(int tt = 0; tt < t; tt++){n = 0;scanf("%d %d\n",&x,&y);for(int i = 0; i < y; i++){gets(g[i]);for(int j = 0; j < x; j++)if(g[i][j]=='A'||g[i][j]=='S'){xy[j][i] = n;n++;}}for(int i=0;i<y;i++){ for(int j=0;j<x;j++){ if(g[i][j] == 'S' || g[i][j] == 'A'){ bfs(j,i); } } }printf("%d\n",Prim());}}总结: 这题技术上不难, 但是有点坑. 对于给定的迷宫, 首先找出所有的A或者S, 编号并保存位置. 然后求出两两间的距离, 构造完全图. 最后对这个完全图用Prim算法计算最小生成树, 所得权值既是所求. 看起来很简单的样子只需要BFS + Prim就能搞定, 但是一定要注意对BFS的优化. 一开始我用的BFS模板是在每次pop的时候操作vis数组, 然后就一直TLE, 直到我把这个vis操作放到push的后面...浪费我2个小时来调...
阅读全文
0 0
- POJ 3026.Borg Maze
- poj 3026 Borg Maze
- POJ 3026 Borg Maze
- POJ 3026 Borg Maze
- poj 3026 Borg Maze
- poj-3026-Borg Maze
- POJ 3026 Borg Maze
- POJ 3026 Borg Maze
- poj 3026 Borg Maze
- POJ-3026-Borg Maze
- poj 3026 Borg Maze
- POJ 3026 Borg Maze
- POJ 3026 Borg Maze
- poj 3026 Borg Maze
- poj 3026 Borg Maze
- POJ:3026 Borg Maze
- poj 3026 Borg Maze
- POJ 3026-Borg Maze
- Java 8 Spliterator接口 迭代式字数统计示例
- 洛谷1979/codevs3290 华容道,74行就写完了?
- Struts2中的拦截器
- onCreate获取view坐标和尺寸为0 的总结
- iOS调试——关于insertRowsAtIndexPaths方法崩溃以及动画实效的处理办法
- POJ 3026.Borg Maze
- 对sessionStorage 缓存的值进行加密
- TensorFlow:Chap4笔记总结
- js获取指定字符前后字符串的简单实例,js截取字符串;
- linux 中定时
- 关于静态变量的修改以及线程休眠
- [Azure]ARM模式下批量清理未使用的托管磁盘
- python 面向对象(进阶篇)
- 制作嵌入式根文件系统的错误分析