dijkstra算法

有向非负带权如图所示:

dijkstra算法_第1张图片

为了更加方便理解dijkstra算法,我们先把所有的有向边全部删掉,从源点开始,红色表示未被访问的点,白色表示已经被访问过的点,设v0到v0的路径为0,v0到所有点的距离为无穷大

如下图所示:从v0开始,我们将与v0相连的边全找出来,如下图所示,找到所有边中权值最小的边,并且,将与该条边相连的点标记为已经访问,此时,该条边就是v0到v1的最短路径。(可证明,若改条边不是v0到v1的最短路径,那么一定会有一条路径使得v0到v1经过中介点m,使得v0到v1路径最短,那么v0到v1的直接距离一定会比v0到中介点的距离大,这与我们找到的v0到v1是与v0相连路径中最短路径冲突)

dijkstra算法_第2张图片

此时,我们从最新标记已经访问过的点v1出发,找出所有与v1相连的,且以v1为出发点的有向边,并且找到所有有向边中的最短路径,此时我们发现,由v0到v3的直接路径为4,而v0经过v1为中介点到v3的距离为3,此时我们更新v0到v3的最短路径

dijkstra算法_第3张图片

此时,我们发现未被访问过的点,中v0到v3的距离是最短的,将v3更新为已经访问,此时,我们将以v3为出发点,与v3相连的有向边全部找出

dijkstra算法_第4张图片

此时,我们发现由v0直接到v4的路径比v0经过v3到v4的路径要短,因此,我们无需更新v0到v4的最短路径

v0经过v3到v2的距离由无穷大变为5,更新v0到v2的最短路径

dijkstra算法_第5张图片

我们发现由由v0出发,且与v0距离最小的点是v4,把v4设为已经访问,且找出以v4为出发点,与v4相连的有向边,我们发现v0到v5经过v4所需的路径为7,此时更新v0到v5的最短距离

dijkstra算法_第6张图片

由v0出发到未被访问的点且路径最短,此时找到v2,将该点变为已经访问,且找到以v2为出发点的有向边,此时更新v5的距离

 

dijkstra算法_第7张图片

找到未被访问的点,使得v0到该点的距离是所有未被访问点中路径最短的,找到v5,标记v5为已经访问

dijkstra算法_第8张图片

此时已经全部更新完成

代码如下:
dijkstra算法_第9张图片

dijkstra算法_第10张图片

测试结果:

dijkstra算法_第11张图片

你可能感兴趣的:(最短路径,dijsktra)