6.9.单源最短路径问题-BFS算法

一.前言:

问题1:

以上述图片为例,比如从G港到Y城,可以是G港->R城->Y城,也可以是G港->P城->Y城等,有很多条路径都可以实现从G港到Y城,但要从中找出G港到Y城距离最短的那一条路径,这就是单源最短路径问题。

单源最短路径问题就是只有一个源头,从该源头出发,到达其他任意一个顶点可以走的最短路径。

对于单源最短路径的题型,需要掌握BFS算法(可以求无权图的单源最短路径)和Dijkstra算法(可以求带权图和无权图的单源最短路径)。

问题2:

上述图片的各个城市需要往来,相互之间怎么走距离最近呢?比如R城和M城之间要走哪条路比较划算即距离最近,Y城和P城之间要走哪条路比较划算即距离最近,所以在这样的应用场景之下,我们就要确定每对顶点间的最短路径。

对于各顶点间的最短路径的题型,需要掌握Floyd算法(可以求带权图和无权图的各顶点间的最短路径)。


二.BFS算法求无权图的单源最短路径的准备工作:

1.注意:无权图可以视为一种特殊的带权图,只是每条边的权值都为1或者权值都一样的边

2.实例:

以上述图片为例,从2号顶点出发,求出到达各个顶点的最短路径,如下图:

如上图,通过BFS算法,从2号顶点出发,可以找到与2号顶点相邻的的顶点即1、6号顶点,2号顶点与1、6号顶点之间的距离都是1(无向图的边的权值可以视为1),如下图:

如上图,通过1、6号顶点可以找到5、3、7号顶点,2号顶点到达5、3、7号顶点的最短路径都是2,如下图:

如上图,继续往下找可以找到4、8号顶点,2号顶点到达4、8号顶点的最短路径都是3,如下图:

所以对上述图片里的图执行一次BFS算法即广度优先遍历,就可以得到2号顶点到达其他所有顶点的最短路径。


三.BFS算法求无权图的单源最短路径的代码实现:

1.代码:

如上图,需要在原有的BFS算法的代码上进行改造->在BFS函数中用visit函数来抽象地表示出对某一个顶点的访问,改造成求最短路径,只需要把visit函数的作用进行改造即可,如下图:

上述图片的代码解读:

  • BFS_MIN_Distance函数的第一个形参Graph G表示图,第二个形参int u表示当前顶点的编号,G.vexnum表示图的顶点个数;

  • d[]数组用来记录起始顶点到各个顶点的最短路径的长度;path[]数组用来记录每

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值