最短路径算法有Dijkstra算法和floyd算法,分别求单源最短路径问题和多源路径问题,但Dijkstra有一个限制:边不能为负值。而Bellman_ford算法就是用来解决这个问题的。它可以允许边为负值的情况,所以相对于Dijkstra算法使用面要更广。
Bellman_ford算法的使用条件:
1)单源最短路径问题
2)有向图&无向图(可以看成有向图)
3)可以有负权边,但不能有负权环,如有则输出错误信息
4)差分约束系统
Bellman_ford算法的基本步骤如下:
1)初始化,将dis数组初始为无穷大,将pre数组初始化为一个无意义的数nil,并置dis[s]=0;pre[s]=s;s为源点。
2)对于每一条边,进行松弛操作。若dis[v]>dis[u]+value[u][v],则将dis[v]的值置为dis[u]+value[u][v]。
3)步骤2)循环nodenum-1次,其中nodenum为图中的顶点个数。
4)进行检查,判断是否存在负权环,对于每条边,判断是否有dis[v]>dis[u]+value[u][v]成立,若有则说明存在负权边,给出错误信息。否则没有,成功求得最短路径。
算法结束。这样以后,dis[u]表示源点s到u的最短距离,若为无穷大则说明两点之间不可达,pre[u]表示源点到u的最短路径中u之前的一个顶点。相应的若dis[u]的值为无穷大,则pre的值无意义。
下面是其代码:
</