Dijkstra算法
1.定义概览
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。
问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)
最短路径算法主要有二(Dijkstra算法和Floyd算法),Dijkstra算法研究的是从初始点到其他每一结点的最短路径 ,而Floyd算法研究的是任意两结点之间的最短路径
Dijkstra算法在应对数据规模量级的增大的情况下表现出来的性能是很优越的(耗时短),这也是在面对大规模图结构的时候不能使用Floyd算法的原因。
2.算法描述
1)算法思想:
Dijkstra算法是典型最短路径算法,用于计算一个节点到其他所有节点的最短路径。以源点为中心向外层层扩展,直到扩展到终点为止;算法中引入两个集合S(dis数组)和U。S的作用是记录已求出最短路径的节点(以及相应的最短路径长度即源点到该节点的最短距离),而U则是记录还未求出最短路径的节点(以及该节点到源点s的距离)。
设G=(V,E)是一个加权有向图,把图中节点集合V分成两组,第一组点集合S包含已求出最短路径的节点(初始时S中只有初始源点s,以后每求得一条最短路径 , 就将加入到集合S中,直到全部节点都加入到S中,算法就结束了),第二组为其余未确定最短路径的节点集合(用U表示),按最短路径长度的递增次序依次把第二组的节点加入S中。在加入的过程中,总保持从源点s到S中各节点的最短路径长度不大于从源点v到U中任何节点的最短路径长度。此外,每个节点对应一个距离,S中的节点的距离就是从s到此节点的最短路径长度,U中的节点的距离,是从s到此节点只包括S中的节点为中间节点的当前最短路径长度。
2)算法步骤:
a.初始时,S只包含源点,即S={s},s的距离为0。U包含除s外的其他节点,即:U={其余节点},若s与U中节点u邻接,则<s,u>正常有权值,若u不是v的出边邻接点,则<s,u>权值为∞。
b.从U中选取一个距离s最小的节点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各节点的距离;若从源点s到节点u的距离(经过节点k)比原来距离(不经过节点k)短,则修改节点u的距离值,修改后的距离值为节点k的距离值+<k,u>边上的权。
d.重复步骤b和c直到所有节点都包含在S中。
3.算法示例
1)示例一
算法步骤:
(1)初始时,源点 s 的路径权重被赋为 0 (dis[s] = 0)。若对于节点 s 存在能直接到达的边(s,m)