【校招VIP】最短路径

2天前 收藏 0 评论 0 java开发

【校招VIP】最短路径

转载声明:文章来源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^{(0)},和Path^{(0)}

接着写出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 0条回复 评论

帖子还没人回复快来抢沙发