定义一个有向图D=(V, A),对每一个弧a=(vi, vj),相应地有权ω(a)=ωij,又给定D中的两个顶点vs,vt。设P是D中从vs到vt的一条路径,定义路P的权是P中所有弧的权之和,记为ω§。最短路径问题就是要在所有从vs到vt的路中,求一条权最小的路,即求一条从vs到vt的路P0,使ω(P0)=min ω(P)
在Dijkstra算法中,用P(v),T(v)分别表示点v的P标号和T标号,Si表示第i步时,具P标号的点的集合。为了求出从vs到各点的距离的同时,也求出从vs到各点的最短路径,给每个点v以一个λ值,算法终止时,如果λ(v)=m,表示在从vs到v的最短路径上,v的前一个点是vm;如果λ(v)=M,表示D中不含从vs到v的路;λ(v)=0表示v=vs。
Dijkstra算法具体步骤:
给定赋权有向图D=(V, A)。
开始(i=1)令S1={vs},P(vs)=0,λ(vs)=0,对每一个v != vs,令T(v)= ++,λ(v)=M,令k=s。
第一步:如果Si=V,算法终止,这时,对每个v∈Si,d(vs,v)=P(v);否则转入第二步。
第二步:考查每个使(vk, vj)∈A且vj !∈ Si的点vj。如果T(vj) > P(vk) + ωkj,则把T(vj)修改为P(vk) + ωkj,把λ修改为k;否则转入第三步。
第三步:令T(vj) = min vj !∈ Sj {T(vj)} 。
如果T(vji) < ++, 则把vji的T标号变为P标号P(vji) =T(vji) ,令Si+1=Si∪{vji},k=j,把i换成i+1,转入第一步;否则算法停止,这时对每一个v ∈ Si,d(vs,v)=P(v),而对每一个v !∈ Si,d(vs,v)=T(v)。
来源:CSDN
作者:HHTING
链接:https://blog.csdn.net/qq_42937176/article/details/103648223