图的Dijkstra算法详解

1.定义概览

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2.算法描述

算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

(1)
初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。

(3)
更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

(4) 重复步骤(2)和(3),直到遍历完所有顶点。

图例

初始状态:

S是已计算出最短路径的顶点集合,U是未计算除最短路径的顶点的集合!head(next,length) ,head代表终点,next代表到底终点的当前最短路径的下一个点,next=’-'代表当前无法到head,length代表当前最短路径的长度,length='max’代表到达head的路径为无穷大。

第1步:将顶点a加入到S中。

S={a(-,0)}
U={b(a,3),c(-,max),d(a,7),e(-,max)}

第2步:将顶点b加入到S中。

上一步操作之后,U中顶点b到起点a的距离最短;因此,将b加入到S中,同时更新U中顶点的距离。以顶点c为例,之前c到a的距离为max;但是将b加入到S之后,c到a的距离为7=(a,b)+(b,c)。

 S={a(-,0),b(a,3)}
 U={c(b,7),d(b,5),e(-,max)}

第3步:将顶点e加入到S中。
上一步操作之后,U中顶点d到起点a的距离最短;因此,将d加入到S中,同时更新U中顶点的距离。以顶点e为例,之前e到a的距离为max;但是将d加入到S之后,e到a的距离为9=(d,a)+(e,d)。

 S={a(-,0),b(a,3),d(b,5)}
 U={c(b,7),e(d,9)}

第4步:将顶点c加入到S中。

 S={a(-,0),b(a,3),d(b,5),c(b,7)}
 U={e(d,9)}

第5步:将顶点e加入到S中。

 S={a(-,0),b(a,3),d(b,5),c(b,7),e(d,9)}
 U={}

此时,起点D到各个顶点的最短距离就计算出来了:

b(3) c(7) d(5) e(9)

C语言程序结果
图例
结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值