博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有向无权图最短路径问题——BFS求解
阅读量:4136 次
发布时间:2019-05-25

本文共 1306 字,大约阅读时间需要 4 分钟。


解释

有向无权图

图1

如图1所示,这是一个有向无权图,如果选中某个定点作为起始顶点s,我们要找出s到其他所有顶点的最短路径问题。由于是无权的,所以我们只关心最短路径所包含的边数。这就是一个有向无权图求最短路径的问题,用到BFS算法,广义优先搜索算法。

流程解析

设s为选中的v3。

找出所有从s出发路径长为1的顶点之后的图
从s出发路径长为1的顶点之后的图

此时可以看到从s出发到v3的最短路径长为0的路径,只有v3自己。把这个标记下来。然后寻找所有从s出发路径长为1的顶点,这些顶点可以通过考察s邻接的顶点找到。

找出所有从s出发路径长为1的顶点之后的图
找出所有从s出发路径长为1的顶点之后的图
现在寻找从s出发,最短路径为2 的顶点,找出所有邻接到v1和v6的顶点(距离为1处的顶点)。它们的最短路径还不知道,这次搜索告诉我们,到v2和v4的最短路径长为2。下图显示了到目前为止所做的工作。
这里写图片描述
找出所有从s出发路径长为2的顶点之后的图

最后通过考察那些邻接到刚被赋值的v2和v4的顶点可以发现,v5和v7各有一条三边的最短路径。现在所有顶点都已经计算。下图显示最终的算法结果。

这里写图片描述

上述搜索方法称为广度优先搜索(breadth first search)。该方法是按层处理顶点:距开始点最近的那些顶点首先被求值,而最远的那些顶点最后被求值。这很像对数的层序遍历(level order traversal)。

下图是用于求无权最短路径计算的表的初始配置

求无权最短路径

对于每个顶点,我们需要跟踪三个信息。known表示该顶点是否被处理,即求取到s的最短路径;距离d为所求取的路径长,开始被赋值无穷大,pv表示路径,通过追溯pv可以显示实际的路径长。

算法的伪代码如下

void Graph::unweighted(Vextex s){    for each Vertex v    {        v.dist=INFINITY;        v.known=false;    }    s.dist=0;    for(int currDist=0;currDist

上述代码运算复杂度是O(V^2)

下面给出使用O(V+E)复杂度的算法,类似于拓扑排序,使用连接表可以降低算法的时间复杂度为O(V+E)。

void Graph::unweighted(Vertex s){    Queue
q; for each Vertex v v.dist=INFINITY' s.dist=0; q.enqueue(s); while(!q.isEmpty()) { Vertex v=q.dequeue(); for each Vertex w adjacent to v if(w.dist==INFINITY) { w.dist=v.dist+1; w.path=v; q.enqueue(w); } }}

上述算法的运行情况如下:

无权最短路径算法期间数据如何变化

实际例子

代码参考:

你可能感兴趣的文章
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>