单源最短路径问题:给定带权有向图G(V,E)和图中某点V0,求从V0到其他点的最短路径
1.Dijsktra
注意:不能用于图中有负权的情况,可否把所有边的权加上够大的值,使所有边的权为正,再计算?
(1)令集合S={V0},T=V-S,初始化Dist[i],Dist[0]=0,Dist[i]=w(0,i)
(2)循环直至S=V
a.对T中的点,取Dist最小的点j,S=S+{j},T=T-{j}
b.更新T中点的Dist
for k in T
if(Dist[k]>Dist[j]+w(j,k)) Dist[k]=Dist[j]+w(j,k)
2.Bellman-Ford
注意:可用于图中存在负权的情况,可检测图中是否存在负回路
(1)初始化Dist[i],Dist[0]=0,Dist[i]=正无穷
(2)循环n-1次,n为图中的点数
bool updated = false
for (i,j) in E //遍历图中的每条边
if(Dist[j]>Dist[i]+w(i,j))
Dist[j]=Dist[i]+w(i,j)
updated = true
if(!updated)
break
(3)判断图中是否存在负回路
for (i,j) in E
if(Dist[j]>Dist[i]+w(i,j))
return false //存在负回路
(4)return true //不存在负回路