题目链接:

http://poj.org/problem?id=3026

解题思路:

感觉这题好坑呀,如果不是看了这封博客,不知道还会哭多久。。。http://blog.csdn.net/lyy289065406/article/details/6645991

题目大意:

在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度。

一格的长度为1,而且移动的方法只有上、下、左、右,

所以在无任何墙的情况下(但“墙#”是必须考虑的,这里只是为了说明)

任意两个字母之间的距离就是直接把 横坐标之差 加上 纵坐标之差

注意的是,可行的路为 字母 和 空格;不可行的路为 # 和 矩阵范围之外

根据题意的“分离”规则,重复走过的路不再计算

因此当使用prim算法求L的长度时,根据算法的特征恰好不用考虑这个问题(源点合并很好地解决了这个问题),L就是最少生成树的总权值W
 
由于使用prim算法求在最小生成树,因此无论哪个点做起点都是一样的,(通常选取第一个点),因此起点不是S也没有关系

所以所有的A和S都可以一视同仁,看成一模一样的顶点就可以了
 
最后要注意的就是 字符的输入。。。输入m,n后,只能用gets吸收。。。getchar会wrong。。。也不知道后台到底是什么样的神数据。。。

剩下的问题关键就是处理 任意两字母间的最短距离,由于存在了“墙#” ,这个距离不可能单纯地利用坐标加减去计算,必须额外考虑,推荐用BFS(广搜、宽搜),这是本题的唯一难点,因为prim根本直接套用就可以了

求 任意两字母间的最短距离 时不能直接用BFS求,

1、必须先把矩阵中每一个允许通行的格看做一个结点(就是在矩阵内所有非#的格都作为图M的一个顶点),对每一个结点i,分别用BFS求出它到其他所有结点的权值(包括其

本身,为0),构造结点图M;

2、然后再加一个判断条件,从图M中抽取以字母为顶点的图,进而构造字母图N

这个判定条件就是当结点图M中的某点j为字母时,把i到j的权值再复制(不是抽离)出来,记录到字母图N的邻接矩阵中

3、剩下的就是对字母图N求最小生成树了

AC代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 0xfffffff
using namespace std;const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
struct node{int x,y;
};
int n,m;
char maze[110][110];
int vis1[110][110];//记录当前格是否为字母,是第几个字母
int dist[110][110];//构造结点图的两结点间权值
int cost[110][110];//vis2和cost记录价值
int vis2[110];//记录最小生成树结点的遍历
int dis[110];void bfs(int x,int y){queue<node>q;while(!q.empty())q.pop();memset(dist,-1,sizeof(dist));dist[x][y] = 0;q.push(node{x,y});while(!q.empty()){node cur = q.front();q.pop();if(vis1[cur.x][cur.y] != -1)cost[vis1[x][y]][vis1[cur.x][cur.y]] = dist[cur.x][cur.y];抽取字母到字母的边权 for(int i = 0; i < 4; i++){int xx = cur.x+dx[i],yy = cur.y+dy[i];if(xx < 0 || xx >= n || yy < 0 || yy >= m || maze[xx][yy] == '#' || dist[xx][yy] != -1)continue;dist[xx][yy] = dist[cur.x][cur.y]+1;q.push(node{xx,yy});}}
}int prim(int n)
{int i, j, tmp;int sum = 0;memset(vis2, 0, sizeof(vis2));vis2[0] = 1;for(i = 0; i < n; i++)dis[i] = cost[0][i];for(i = 1; i < n; i++){int Min = INF;for(j = 0; j < n; j++){if(!vis2[j] && dis[j] < Min)Min = dis[tmp = j];}vis2[tmp] = 1;sum += Min;for(j = 0; j < n; j++){if(!vis2[j] && dis[j] > cost[tmp][j])dis[j] = cost[tmp][j];}}return sum;
}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&m,&n);memset(vis1,-1,sizeof(vis1));int sum = 0;gets(maze[0]);for(int i = 0; i < n; i++){gets(maze[i]);for(int j = 0; j < m; j++)if(maze[i][j] == 'A' || maze[i][j] =='S')vis1[i][j] = sum++;}for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)if(vis1[i][j] != -1)bfs(i,j);printf("%d\n",prim(sum));}return 0;
}

POJ 3026 Borg Maze(BFS+最小生成树)相关推荐

  1. poj 3026 Borg Maze (最小生成树+bfs)

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

  2. 一道神坑题 POJ3026 Borg Maze BFS+prim算法

    题意不说 附上链接 http://poj.org/problem?id=3026 反正先用BFS搜一遍图 记录 S和A之间的路 用一个二维数组存储 (注意 把每个S或者A 都搜一遍) 好了 剩下的就是 ...

  3. POJ - 3026(BFS+最小生成树.krustal)

    题目: 题目链接: http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  4. 【POJ 3026】Borg Maze

    [POJ 3026]Borg Maze 一个考察队搜索alien 这个考察队能够无限切割 问搜索到全部alien所须要的总步数 即求一个无向图 包括全部的点而且总权值最小(最小生成树 BFS+最小生成 ...

  5. Borg Maze (最小生成树+bfs)

    Borg Maze 题目描述: The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant ...

  6. Borg Maze最小生成树

    Borg Maze 原题链接https://vjudge.net/contest/352170#problem/I 本题给出一个地图,以及各个点的位置,大概意思就是所有点全部链接的最短路径,使用bfs ...

  7. poj3206(bfs+最小生成树)

    传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...

  8. J - Borg Maze

    J - Borg Maze 思路:bfs+最小生成树. #include<queue> #include<cstdio> #include<cstring> #in ...

  9. POJ 3414 Pots【BFS】+ Python

    原题链接: 3414 -- Pots 参考资料:POJ 3414 - Pots | 眈眈探求 POJ 3414 Pots[BFS][图搜] - it610.com 一 特别注意: 1. 每一种操作对应 ...

  10. (POJ 3026) Borg Maze 最小生成树+bfs

    题目链接:http://poj.org/problem?id=3026. DescriptionThe Borg is an immensely powerful race of enhanced h ...

最新文章

  1. 使用Crypto++ ecdsa 进行签名和认证
  2. android 购物车小美的店,[转载]【小美教程】买菜累啊有木有?购物车用的购物袋教程来啦.........
  3. WIX、Squarespace、WordPress 三者的优劣分别是什么?
  4. 织梦首页html在哪儿,dedecms织梦首页去index.html
  5. 关于换行这个动作,win 和 mac 的实现
  6. Tensorflow深度学习应用(进阶篇)-1
  7. C++中类和对象的一些注意事项 --- 多态
  8. NS2相关学习——完成一个新的协议(1)
  9. ArcGIS Server 中AJAX应用系列(3)
  10. BZOJ.4650.[NOI2016]优秀的拆分(后缀数组 思路)
  11. MAMP Pro for Mac(PHP/MySQL开发环境)v6.6
  12. 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程)
  13. python pyaudo播放wav声音文件
  14. 超详细的Redis实战笔记
  15. 快速找回Edge浏览器书签的方法
  16. 高通MSM8255 GPS 调试分析Android系统之Broadcom GPS 移植【转】
  17. Child returned status 1问题解决
  18. 身份证阅读器身份证读卡器Linux系统二次开发包(含Linux身份证相片解码库)
  19. mathorcup历年优秀论文阿里云盘
  20. 3.2.3.2Golang的数据类型--字符串

热门文章

  1. display的contents属性
  2. 记录一下近期自己的顿悟
  3. 划分离散数学定义_《离散数学》学习记录 - 集合论
  4. opencv物体识别-识别水果
  5. SMS发送流程 Android2.2
  6. Java项目:医疗管理系统 (java+Springboot+Maven+Mybatis-plus+Vue+Mysql)
  7. (无技术)我的网站开发之路及部分服务器商优缺点
  8. Spring Boot 通过 Mvc 扩展方便进行货币单位转换
  9. Sql Server排序规则(转)
  10. js实现类似栈和队列的行为,以及push和unshift两个方法的性能测试