1.一对多的无负权环路最短路问题可使用贝尔曼-福特算法求解
2.多对多的无负权环路最短路问题可使用弗洛伊德-瓦尔肖算法求解
3.迪杰斯特拉算法适用于一对多且路为非负的最短路问题
4.一对多的无环有向图也有最高效的算法
继上一篇最短路问题,我们介绍几种利用动态规划思想开发的算法。
传送门:最短路与动态规划(一)
1
一对多最短路算法
先介绍第一个无负权环路的最短路算法,由贝尔曼(R.E.Bellman)和福特(L.R.Ford)从函数方程启发而得的算法——贝尔曼-福特算法。为此,我们先引入记号:
我们先给出算法的详细流程:
我们以“双环”马戏团为案例,来感受一下该算法的全流程,起点为节点1,对于t=0,很显然有:
对于t=1,我们有:
最终我们得到下面这张从t=0到6的表格,对应的d[k]进行更新:
可以看到,从起点1到终点9的最短路长度是5.5(这里指成本),为了方面,我们做了简化,并且把最短路用绿色底色标注出来:
可以看到,从终点开始,t=5时刻的最短路上一个节点是8,t=4时节点8的上一个节点是7,以此类推,得到了最短路径:1-3-5-7-8-9,下图的红色路径就是最短路:
上面的算法能终止条件是图中不包含负权环路,如果遇到了负权环路,它就会不断变化,我们也可以用来判断一个图中是否包含负权环路。有原理:
如果贝尔曼-福特算法遇到了有负权环路的情况,那么当t=节点数后,v[k]仍有可能在不断变化,而仍在变化的节点处于那个负权环路之中