一,动态规划:
设起点为st,终点为ed。
用dis(v)表示v到st的距离。
动态规划方程:dis(v)=$min_{(u,v)∈E}{dis(u)+d(u,v)}$
初值dis(st)=0。
伪代码:(带open标记,省略了追踪数组per)
dis(st)=0
open(st)=true;
for all v!=st
dis(v)=∞
open(v)=false
for 1:|V|-1//推进|V|-1次
for V中所有open=true的节点u
open(u)=false;//关闭
for (u,v)∈E
dis(v)=min{dis(v),dis(u)+d(u,v)};
open(v)=true;//开启
时间复杂度O(n^3)
注:此算法即所谓的Bellman-Ford算法(但添加了open标记),对于含负边的图也有效,如果要检测负环只需在|V|-1次推进后再推进一次,如果本次推进中某个dis值减小,则存在负环。
二,Dijkstra算法:
若图中所有边权非负,则open=true的点中dis最小者只有刷别人的份,而自身永远不会再被别人刷,所以其dis值必已无可改进,所以此时Bellman算法可改进为dijkstra算法。
伪代码:(省略per)
dis(st)=0
open(st)=true
for all v!=st
dis(v)=∞
open(v)=false
while open(ed)!=false//终点未关闭
{
找到V中open=true且dis最小者minv
open(minv)=false;//关闭
for minv所有邻接点v
{
dis(v)=min{dis(v),dis(minv)+d(minv,v)};
open(v)=true;//开启
}
}
注:由于open=false的点的dis值必已达终态,故只要open(ed)==false即可断定计算已完成。
时间复杂度O(|V|^2)。
三,dag(有向无环图)中的最短路径
1,对顶点拓扑排序。
2,对顶点拓扑序列进行一遍扫描,用每个顶点刷其所有后继。
两步时间复杂度均为O(E),故总时间复杂度O(E)。
注:此算法也适用于含负边的情况并且也可用于求dag中的最长路径(关键路径)。
最短路径算法
最新推荐文章于 2022-10-19 17:36:54 发布