【数据结构与算法】Dijkstra算法、Floyd算法

最短路径

前文提到,对于不带权图来说,BFS可以解决最短路径问题,因为它是类似于树的层次遍历那样,同一个结点的后继的访问顺序相邻,这使得BFS首次访问结点时的路径必然是最短的。

但是对于带权图来说,BFS就无法解决了最短路径问题了,除非图中各边的权值相等。所以我们需要用一些其他的算法来解决带权图的最短路径问题。

最短路径问题大致上可以分为两类:一种是单源最短路径,即求图中某一点到其他任意一点的最短路径。另一种是求每对顶点之间的最短路径。

经典的求带权图的单源最短路径的算法有Dijkstra(迪杰斯特拉)算法,求每对顶点间的最短路径的算法有Floyd(弗洛伊德)算法。

Dijkstra和Floyd也能够解决不带权图中的最短路径问题,因为不带权图可以视为每一条边的权值都相同的带权图。

Dijkstra算法

Dijkstra基于贪心算法,它的核心是找出当前集合中顶点可达的,与源点最近的顶点,把它与源点之间的路径视为源点到该点的最短路径,并把它加入到集合中。

例如:

在这里插入图片描述

假设我们找从1到其他各个顶点的最短路径,那么按照Dijkstra算法:

初始顶点集 S = { 1 } S=\{1\} S={ 1}

顶点 第一轮 第二轮 第三轮 第四轮
2 1->2=5
3 1->3=6 1->3=6
4 1->2->4=7 1->2->4=7
5 1->2->5=17 1->2->5=17 1->2->4->5=15
6 1->3->6=9 1->3->6=9
7 1->2->4->7=11
8
S {1,2} {1,2,3} {1,2,3,4}
最短路径 1->2=5 1->3=6 1->2->4=7 1->3->6=9

第一轮,集合S中的顶点可达的顶点有2、3。但1->2的距离最短,所以 1->2 的最短路径 = 5, 把2加入到S中,此时 S = { 1 , 2 } S=\{1,2\} S={ 1,2}

第二轮,集合S中的顶点可达的顶点有3、4、5。但1->3的距离最短,所以1->3的最短路径 = 6,把3加入到S中,此时 S = { 1 , 2 , 3 } S=\{1,2,3\} S={ 1,2,3}

第三轮,集合S中的顶点可达的顶点有4、5、6。但1-2->4的路径最短,所以1->4的最短路径 = 7,把4加入到S中,此时 S = { 1 , 2 , 3 , 4 } S=\{1,2,3,4\} S={ 1,2,3,4}

第四轮,集合S中的顶点可达的顶点有5、6、7。但1->3->6的路径是最短的,所以1->6的最短路径 = 9,把6加入到S中,此时 S = { 1 , 2 , 3 , 4 , 6 } S=\{1,2,3,4,6\} S={ 1,2,3,4,6}

后面依次类推,直到所有的顶点都被包括在S中。

实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值