最短路径

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

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

(1)单源最短路径,即求图中某一个顶点到其他各个顶点的最短路径。

(2)求每对顶点间的最短路径

(----可能有人看完者定义就受不了了,什么东西-----)

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

你是不觉得这有啥bb的,看下图假如你要从南宁去哈尔滨,你就不能一下找到最短路径。这就是研究这个问题的意义的价值。比如实时交通陆路线,工程中的修桥架线等都有用到。

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

     求带权有向图某个源点到其余各个顶点的最短路径。常用Dijksta算法。

先来看实例

对下图用该算法,求从顶点1到其余顶点的最短路径

接着看下图

顶点

第1轮

第2轮

第3轮

第4轮

2

10

v1->v2

8

v1->v5->v2

8

v1->v5->v2

 

3

14

v1->v5->v3

13

v1->v5->v4->v3

9

v1->v5->v2->v3

4

7

v1->v5->v4

 

 

5

5

v1->v5

 

 

 

集合S

{1,5}

{1,5,4}

{1,5,4,2}

{1,5,4,2,3}

初始,从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轮

第2轮

第3轮

第4轮

第5轮

2

5

v1->v2

5

v1->v2

 

 

 

3

7

v1->v2->v3

 

 

4

11

v1->v5->v4

11

v1->v5->v4

11

v1->v5->v4

11

v1->v5->v4

5

4

v1->v5

 

 

 

 

6

9

v1->v5->v6

9

v1->v5->v6

9

v1->v5->v6

 

集合S

{1,5}

{1,5,2}

{1,5,2,3}

{1,5,2,3,6}

{1,5,2,3,6,

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

第一轮从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的带权有向图,对每对顶点v_{i}\neq v_{j},要求找出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能否改善各顶点间的路径长度

 

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值