迷宫系列(三)利用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算法示例中得到的结果

f
fd

假设起点为A,前往G,显然最短路有两条A->D->G和A->E->G

2.如何根据表格里的数据得到路径呢

h

思路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的实际应用(敲黑板!重要!= ̄ω ̄=)

原创粉丝点击