动态规划最短路算法总结
——以【Layout】差分约束为例
一.差分约束的概念
如果一个系统由 n n 个变量和 个不等式组成,并且这 m m 个不等式对应的系数矩阵每一行有且仅有一个1和-1,其它的都为0,这样的系统成为差分约束系统。
将不等式 变形为 x[i]≤x[j]+a[k] x [ i ] ≤ x [ j ] + a [ k ] ,再令 a[k]=w(j,i) a [ k ] = w ( j , i ) ,令 i=v i = v , j=u j = u ,再将数组名改为 d d ,不等式即可变形为: 。这就使人联想到SPFA中的一个松弛操作:
if(d[u] + w(u,v) <= d[v])
d[v] = d[u] + w(u,v);
虽然两个式子符号不同,但想想看,差分约束受到多个值的约束,这些值里面的最小值就是差分约束能取到的最大数值,而这也正是最短路的结果。所以:
对于每个不等式 x[i]−x[j]≤a[k] x [ i ] − x [ j ] ≤ a [ k ] ,对结点 i i 和 建立一条 j−>i j − > i 的有向边,边权为 a[k] a [ k ] ,求 x[n−1]−x[0] x [ n − 1 ] − x [ 0 ] 的最大值,就是求0到n-1的最短路。
二.最短路算法详解
最短路可分为全点对最短路,代表算法Floyd-Warshall 和单源最短路,代表算法Dijkstra和Bell-Ford 。
1.全点对最短路及Floyd-Warshall算法
全点对最短路的决策量为 D[i,j] D [ i , j ] ,表示 i i 与 之间的最短距离
子结构为 [1:k] [ 1 : k ] ,表示经过的节点数