Dijkstra算法——最短路径

一、最短路径

非网图,最短路径是指两顶点之间的边数最少的路线

路径

途经路径数

A--E

1

A--D--E

2

A--D--C--E

3

A--B--C--E

3

 

在网图中,最短路径是指两顶点之间,所有经历的“边”上的权值之和最短的路线

 

路径

途经各“边”权重之和

A--E

100

A--D--E

90

A--D--C--E

60

A--B--C--E

70

 

单源点最短路径问题:

有向图 G = <V, E>

V   顶点集

图中各顶点的集合(非空集合)

E   边集

V中元素构成的有序二元数组的集合

问题描述:

给定带权的有向图,G = <V, E>, 对任意顶点Vi,Vj ∈V(i≠j),求顶点Vi到Vj的最短路径。

图信息

用矩阵(或者理解为二维数组去存储原图信息)

 

解决方法:

方法一:迪杰斯特拉算法(Dijkstra算法)

假设要寻找从顶点1到顶点6的最短路径。

步骤一:(准备工作)

设置一个集合S(用来放置顶点)最开始只有起点,顶点1(源点v)

S的空间大小是所有顶点个数(这个集合如果放满了就代表不论是从源点到任意点的路径都找完了)

S

1

 

 

 

 

 

 

设置一个用来表示距离的数组dis[],数组的长度是所有顶点个数

步骤二:

初始dis=[0, 1, 12, ∞, ∞, ∞],表示顶点1到其他各个点的距离。

从这个dis[]中找到距离1最小距离的点,是顶点2。

确定最小距离的点是2之后将顶点2放入集合S中。

S

1

2

 

 

 

 

步骤三

S中的新顶点是顶点2,2到其他各个顶点的距离,最短的是顶点4。

           1            2         3     4         5       6

更新:策略是min(原dis中的各元素,dis中上一以确定的顶点2的值+E[2]的对应值)

dis=[min(0,1+∞), min(1,1+0), min(12,1+9), min(∞,1+3), min(∞,1+∞), min(∞,1+∞)]

将顶点4放入S中

S

1

2

4

 

 

 

步骤四

S中的新顶点是顶点4,4到其他各个顶点的距离,最短的是顶点3。

           1            2         3     4         5       6

更新:策略是min(原dis中的各元素,dis中上一以确定的顶点4的值+E[4]的对应值)

dis=[min(0,4+∞), min(1,4+∞), min(10,4+4), min(4,4+0), min(∞,4+13), min(∞,4+15)]

将顶点3放入S中

S

1

2

4

3

 

 

步骤五

S中的新顶点是顶点3,3到其他各个顶点的距离,最短的是顶点5。

           1            2         3     4         5       6

更新:策略是min(原dis中的各元素,dis中上一以确定的顶点3的值+E[3]的对应值)

dis=[min(0,8+∞), min(1,8+∞), min(8,8+0), min(4,8+∞), min(17,8+5), min(19,8+∞)]

将顶点5放入S中

S

1

2

4

3

5

 

步骤六

S中的新顶点是顶点5,5到其他各个顶点的距离,最短的是顶点6。

           1            2         3     4         5       6

更新:策略是min(原dis中的各元素,dis中上一以确定的顶点5的值+E[5]的对应值)

dis=[min(0,13+∞), min(1,13+∞), min(8,13+∞), min(4,13+∞), min(13,13+0), min(19,13+4)]

将顶点5放入S中

S

1

2

4

3

5

6

步骤七

S中的元素的顺序代表路径顺序

1—2—4—3—5—6

而最终的顶点1到顶点6的最短距离是17.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值