首页 > 其他 > 详细

图算法之最短路径(Dijkstra)

时间:2014-04-12 14:42:41      阅读:653      评论:0      收藏:0      [点我收藏+]

Dijkstra最短路径算法是一种单源最短路径,针对的是非负权边。所谓单源最短路径就是指定一个出发顶点,计算从该源顶点出发到其他所有顶点的最短路径。

 bubuko.com,布布扣 

以顶点A作为出发点为例,来说明Dijkstra算法过程。

0,设置两个集合,S集合和U集合。S集合初始只有源顶点即顶点A,V集合初始为除了源顶点以外的其他所有顶点。

设置一个数组dist用来表示顶点A到其他顶点的最短距离,初始化为-1(表示无穷大)。

bubuko.com,布布扣      bubuko.com,布布扣

 

 1,遍历集合V中与A直接相邻的顶点,找出当前与A距离最短的顶点。发现:

A->C = 3

A->B = 6

于是乎,将C移除集合V将其加入到集合S中,于此同时更新dist数组:

dist[C] = 3

dist[B] = 6

更新结果如下:

bubuko.com,布布扣    bubuko.com,布布扣

2,遍历集合V中与C相邻的顶点,发现 C->B = 2 , C->D = 3 , C->E = 4,由于目前dist中最短距离 A->C = 3 即 dist[C] = 3,那么:

A->B = 3 + 2 =5

A->D = 3 + 3 = 6

A->E = 3 + 4 = 7

而目前在dist中:

A->B = 6

A->D = -1

A->E = -1

经过比较,将顶点B加入集合S中,并将其从V集合中删除,更新dist中A->B ,A->D,A->E的记录即:

dist[B] = 5

dist[D] = 6

dist[E] = 7

更新结果如下:

bubuko.com,布布扣   bubuko.com,布布扣

3,遍历集合V中与B相邻的顶点,发现 B->D =  5,在dist中可以查到最短距离A->B = 5, 那么:

A->D = 5 + 5 = 10

而目前在dist中:

A->D = 6

所以,将D加入到集合S中,并将其从V集合中删除,不更新dist数组相应的值,因为dist中A->D即 dist[D] 更短。更新后如下:

bubuko.com,布布扣   bubuko.com,布布扣

4,遍历集合V中与D相邻的顶点,发现 D->E = 2 , D->F = 3, 在dist中可以查到最短距离A->D = 6,那么:

A->E = 6 + 2 = 8

A->F = 6 + 3 = 9

而在dist中:

A->E = 7

A->F = -1

所以将E从集合V中删除并加入到集合S中,并更新dist中的:

dist[F] = 9

bubuko.com,布布扣    bubuko.com,布布扣

5,由于到目前为止只剩下顶点F,所以将F也加入到集合S中,至此算法运行结束。

bubuko.com,布布扣   bubuko.com,布布扣

 

 由此,dist数组就是表示从源点A出发到达其他各个顶点的最短路径,比如 A->F,dist[F] = 9。

图算法之最短路径(Dijkstra),布布扣,bubuko.com

图算法之最短路径(Dijkstra)

原文:http://www.cnblogs.com/nigang/p/3658990.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!