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) | |
---|---|