迷宫系列(三)利用BFS/DFS的数据得到最短路/通路
来源:互联网 发布:行知小学 编辑:程序博客网 时间:2024/05/22 02:15
一、如何得到最短路
算法性质分析
1.BFS性质:
该算法需要在发现所有与这个源节点距离为k的节点后,才回去发现与这个源节点距离为k+1的节点。
故BFS对一个图G的搜索是严格分层的,如果一个点V在第n层被发现,那么它距离源节点的最短距离一定为n,否则将违背BFS算法的性质。
2.DFS性质:
主要思想:一条路走到黑
故:DFS在问题有解的情况下可以顺利找到解,但DFS的搜索是盲目的,它的目的仅仅是走过各种可能的分支来找到问题的解,但不一定是最优解。
比如:DFS算法第一步就走了错误的一步,在此之后即使到达目的节点也不会是最短的路径
3.结论
BFS算法可以用来找出一个图中的最短路
DFS算法不能找出最短路,但可以找出所有通路(虽然BFS也可以)
二、如何得到路径
1.考虑在BFS算法示例中得到的结果
假设起点为A,前往G,显然最短路有两条A->D->G和A->E->G
2.如何根据表格里的数据得到路径呢
思路1.
从起点A开始搜索,根据dis递增的规律来找到G,从而输出正确的路径
分析:不可行
原因:从A点出发会产生过多的旁枝,没有意义
思路2.
从终点G开始逆向搜索,根据dis递减的规律来找到A,从而输出正确的路径
分析:可行
原因:由于起点是唯一的,从G延展出的所有dis严格递减的节点序列最终一定都回到起点A。
3.如何实现?
做法:搜索,深度优先搜索= ̄ω ̄=
伪代码
PATH(节点v){ if (v == 起点) { 从栈底输出栈S,即为最短路径之一; } else { for (与v邻接的每一个元素u) { if (u尚未被访问) { if ( u.dis == v.dis - 1) // u是v的前驱(是u发现的v) { 标记u被访问; 把u压入栈; PATH(u); 取消u的标记; 弹出栈顶元素; } } } }}
另:如何寻找通路
对于通路,我们可以认为只要该节点dis属性不为初始值(-1),这个节点就是可以行走的,所以我们可以从终点起,按照这样的状态转移约束,搜索出所有的通路
下一节将讲解其他的实现细节和DFS的实际应用(敲黑板!重要!= ̄ω ̄=)
阅读全文
0 0
- 迷宫系列(三)利用BFS/DFS的数据得到最短路/通路
- 迷宫问题、最短路(BFS,DFS)
- BFS-最短路(迷宫)
- dfs求连通性,bfs求迷宫最短路
- 迷宫的最短路问题(水+BFS宽搜)
- 迷宫系列(二)搜索、BFS、DFS
- uva1600(最短路 bfs & dfs)
- [容易] BFS求最短路(迷宫类问题)
- 大火蔓延的迷宫,白书P307Uva11624(BFS求最短路)
- 【SPFA + DFS/BFS】最短路的一个拓展题
- hdu 4771 求一点遍历所有给定点的最短路(bfs+dfs)
- 图的遍历(dfs、bfs、最短路、最小生成树、拓扑排序)
- 迷宫的最短路径 (BFS)
- poj 3083 dfs+bfs最短路
- BFS和DFS的差别,BFS实现迷宫最短路径
- 迷宫的最短路路径
- 【搜索】BFS、DFS的综合练习(小鼠迷宫)
- 【51Nod】1459 - 迷宫游戏(bfs & 优先队列 & 最短路)
- Android 7.1 GUI系统-窗口管理WMS-窗口大小计算(五)
- Linux 安装vsftpd
- django CKeditor 正常显示富文本
- Codeforces Round #451 (Div. 2) D. Alarm Clock
- Windows下使用Python配制环境以及打开方式
- 迷宫系列(三)利用BFS/DFS的数据得到最短路/通路
- 推荐系统经典论文文献及业界应用
- 门面模式
- Mahout学习之Mahout简介、安装、配置、入门程序测试
- 职业生涯的思考:产品经理的终极目标-通过产品让生活变得更美好
- TOJ 1048: 简易版最长序列
- 一句话理解复杂语法
- kali 更新修改源 安装中文输入法
- Android 模块化完整方案实现