最短路径(两类)

01月19日 收藏 0 评论 2 java开发

最短路径(两类)

文章申明:转载来源:https://blog.csdn.net/weixin_40805072/article/details/100702827

在带权图中,把一个顶点从v0到图中任意一个顶点vi的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路几个长度最短的那条路径称为最短路径

带权有向图的最短路径分为两类 :

(1)单源最短路径,即求图中某一个顶点到其他各个顶点的最短路径。
(2)求每对顶点间的最短路径
(----可能有人看完者定义就受不了了,什么东西-----)

看下图,你要去学校,有如下路线,假设权值为路程,你肯定会走第三条,因为路程最短;假设权值为所花费人民币,你仍有可能选择,第三条,因为花钱少。

你是不觉得这有啥bb的,看下图假如你要从南宁去哈尔滨,你就不能一下找到最短路径。这就是研究这个问题的意义的价值。

比如实时交通陆路线,工程中的修桥架线等都有用到。

一、迪杰特斯拉算法(求单源最短路径算法)

求带权有向图某个源点到其余各个顶点的最短路径。常用Dijksta算法
先来看实例
对下图用该算法,求从顶点1到其余顶点的最短路径

接着看下图

初始,从v1出发,
第一轮:检测v1与其余各个顶点的当前路程,v1要到v3,v4不可直接到达即为∞,到v2距离为10,到v5距离为5 ,选出v1->v5
第二轮:检测与v5其余各个顶点的当前路程,v1->v5->2 为8,v1->v5->v3为14,v1->v5->v4为7,选出v1->v5->v4
第三轮:检测与v4其余各个顶点的当前路程,v1->v5->v2为8,v1->v5->v4->v3为13,选出v1->v5->v2
第四轮:检测与v4其余各个顶点的当前路程,v1->v5->v2为8,v1->v5->v4->v3为13,选出v1->v5->v2->v3

再来看这该死的过程

算法步骤;
(1)初始化,集合S[]初始为{0},dist[i]=arcs[0][i],i=1,2,3...
(2)从顶点集合V-S出发,满足dist的初始值dist[j]=Min{dist[i] | vi∈V-S},vj 就是当前求得的一条从v0出发的最短路径的 终点, 令S=S∪{j}
(3)修改从v0出发到集合V-S上任一顶点vk可达的最短路径:若dist[j]+arcs[j][k]<dist[k],则令dist[k]=dist[j]+arcs[j][k]。
(4)重复(2)(3)操作共n-1次,直到所有顶点都包含在S中。

做个例题:
求出下图从顶点1到其他各个顶点的最短路径



这个表从第一列第一个往下开始看,直到该列完成。再从下一列第一个往下看,依次看。

第一轮从1出发可以直接到达的是1和5,写上路径和值,其余写无穷;
第一轮选出最短,得到v1->v5,所以v5加入集合S{1,5}

第二轮,把上一轮得到结果的平移抄过去,已经加入集合S的不用抄。现在从5开始判断,5能到达2距离为6,现在的v1->v5->v2为10相比上一轮的v1->v2为5,所以那个为止仍取原来的。

无论1还是5都不能直达3,所以写无穷。对于4,上一轮无法直达,现在5可直达4,此条路径v1->v5->v4为11。
因为结点5已经在集合S中,所以此处为空。

之前无法直达6,现在5可直达6,v1->v5->6为9。
所以第二轮中选出最短的,得到v2加入集合S
{1,5,2}

第三轮:因为2已经在集合中,所以此处为空。因为2可直达3,v1->v2->v3为7,比原来的无穷小所以此处写v1->v2->v3
因为5可直达4,v1->v5->v4为11,相比之前的11一样,所以此处仍为v1->v5->v4
因为5已经在集合中,此处为空。
因为5能直达6,和上一轮一样9,此处仍为 v1->v5->v6

所以第三轮,选出最短v1->v2->v3,将3加入集合S 有{1,5,2,3}

第四轮:因为2,3已在集合中,所以对应位置为空。看从3出发,能否得到更短的结果,不能。再看4,2可到4 ,v1->v2->v4为14,5可到4,v1->v5->v4为11 所以此处仍为v1->v5->v4
因为5在集合中,所以此处为空。
再看6,5可直达6,v1->v5->v6为9
第四轮选出最短为9,将6加入集合S, 得到{1,5,2,3,6}

第五轮:2,3已在集合中对应为空。此时达到4的最短为v1->v5->v4。5,6已在几何中,对应位置为空。
第五轮选出最小,将4加入集合得到
{1,5,2,3,6,4}
————————————————————————————————————————————————————————
注:当边上有负权值,迪杰特斯拉算法不再适用。

二、Floyd求各顶点之间最短路径

求各顶点之间最短路径:已知一个各边权值均大于0的带权有向图,对每对顶点,要求找出vi与vj之间的最短路径和最短路径长度。

还是来看题

上图为一个带权有向图,及其邻接矩阵.如下为执行过程。

如图,

写出,和

接着写出A(1)和Path(1) ,将第一行和第一列全copy过来,检测经过顶点1能否改善各顶点间的路径长度

若比原来短,则更改对应位置值,否则保留原来的值。

例如,之前3->2的路径值为5,经过1为3->1->2的路径值为4,更改为4
之前,2->4路径值为2,经过1为2->1->4的路径值为4为5,仍保留2。

路径值更新的地方,对应的Path中对应位置值更改为同一列中的第一行的值

接着写出A(2)和Path(2) ,将第二行和第二列copy过来,检测经过顶点2能否改善各顶点间的路径长度



C 2条回复 评论
欢乐马

这题有够坑的,老是错

发表于 2023-08-26 23:00:00
0 0
希望找回我家的猪

在卷的地方,测试要比开发还要开发,又要懂业务又要懂测试,还要懂运维,我都搞不懂现在测试到底是个什么角色了

发表于 2022-03-05 21:00:00
0 0