权值的概念引入:
权值就是定义的路径上面的值。
一般来说,权值愈小,路径愈佳。
Bellman-ford算法的简介:
Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。
松弛:
松弛就是更新两点间的最短路径。
Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题。对于给定的带权(有向或无向)图 G=(V,E), 其源点为s,加权函数 w是 边集 E 的映射。对图G运行Bellman - Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到 图G的任意顶点v的最短路径d[v]。
- 初始化:将除源点外的所有顶点的最短距离估计值 d[v] ——>+∞, d[s]——>0;
- 迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)
- 检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回true,并且从源点可达的顶点v的最短距离保存在 d[v]中。
##注意:
无论是在算法导论上,还是,实际的代码比较过程中,bellman算法和dijisktra算法都非常像,但是有几个关键的不同导致了两个算法的根本不同。在松弛的过程中,dijiskstra算法中有着贪心的思路,它每一次迭代都找出了一个子问题的最短路径。并用到新的一轮迭代的过程中去,使问题的规模不断减少,因此需要用到一个visit数组来记录该节点的最短路径是否被找到。另外,在dijisktra算法中默认,