[记号]
记加权图G(V,E):w(u,v)。记路径p的长度为w(p)。
[预备知识]
<单源最长路及其求法>
最长路的定义与最短路是对偶的。
对加权图G(V,E):w(u,v)及源点s∈V。若对于某一点v∈V,存在一条从s到v的路径p*使得w(p*) >= w(p),其中p为从s到v的任意路径,则称p为从s到v的最长路,w(p*)为最长路长度,记做D[v]。如果图中不存在正权环,则对于任意v∈V,D[v]都是一个确定的有界值。
(注意:在最长路问题中,若(u,v)不属于E,则隐式地有w(u,v)=-INF,这和最短路是相类似的)
<最长路求解>
那么如何求对于每一点的最长路长度D[v]呢?
定义G的对偶图G*(V,E):w*(u,v)=-w(u,v),即G*中每条边权值为原图的相反数。则易知对于任意一条路径p有w(p)=-w*(p)。
我们考察G*以s为源点的单源最短路问题。若G*无负权环(则G无正权环),则对于任意v∈V,有d*[v] <= w*(p),其中d*[v]为最短路长度,w*(p)为任意从s到v的路径p的长度。变形得到-d*[v] >= w(p),容易看出若令D[v]=-d*[v],则D[v]就是G的最长路长度。即我们可以通过求G*的单源最短路来得到G的单源最长路。
实现时,可以不必对G的权取相反数。我们注意到对G*的松弛过程:if (d*[v] > d*[u]+w*(u,v)) then d*[v] = d*[u]+w*(u,v),我们令D[v]=-d*[v],稍作变形得到:if (D[v] < D[u]+w(u,v)) then D[v] = D[u]+w(u,v)。注意到这里的D数组实际上就是上面所说的(松弛过程中的)最长路长度数组。因此,可以直接对图G进行SPFA(还是"S"PFA吗?),只要改变松弛过程即可。注意由于d*[v]的初始值是INF,则D[v]的初始值=-d*[v]=-INF。
<最长路三角不等式>
D[v] >= D[u]+w(u,v),证明类似最短路的三角不等式。见算法导论p361。
<前趋子图与最短/最长路径树>
见算法导论p361。
<差分约束系统及约束图>
见算法导论p370-p372。
[差分约束系统的最大解与最小解]
算法导论只提到了约束图G(V,E):w(u,v)能对应形如x[v]-x[u] <= w(u,v)的约束系统。事实上,G(V,E):w(u,v)还能对应形如x[v]-x[u] >= w(u,v)的约束系统,只不过此时约束系统有解对应每个点的最长路径长度D[v]都存在(图中无正权环)。证明过程类似于前一种约束系统,使用到最长路的三角不等式,参见算法导论p371。
差分约束系统的最大解是针对前一种约束系统而言的,指在某个变量确定的情况下,其他所有变量都取到所能取的最大值。最小解则针对后一种约束系统,其定义可以类比。
我们将看到,在某个变量确定的情况下,约束图以超级源点(假设编号为0)为根的最短路径树所给出的解是前一种约束系统的最大解,同理,其最长路径树是后一种约束系统的最小解。
我们用前面一条来说明,后面一条的可以类比得到。假设约束系统存在解,我们知道,给定超级源点的一个偏移量d[0](即d[0]不一定为0),就能由最短路径树确定差分约束系统的一组解(树上两点间路径唯一确定)。同样的,给定最短路径树上任一个节点的值d[v],都可以求出超级源点的偏移量d[0],同样也确定了差分约束系统的一组解。对于从0到v的任意一条路径p(0,v1,v2,...,vN,v),其所表示的约束式分别为:x[v1]-x[0] <= 0;x[v2]-x[v1] <= w(v1,v2);...;x[v]-x[vN] <= w(vN,v)。叠加得到x[v]-x[0] <= w(p),令x[0]为确定值d[0],即x[v] <= d[0]+w(p),p为从0到v的任意路径。取p为0到v的最短路p*,就有x[v] <= x[0]+w(p*) <= x[0]+w(p)。则当x[v]=d[0]+w(p*)时x[v]取得最大值。
[鸣谢]
感谢lxyxynt大神对我的指导!
转载自:http://hi.baidu.com/jffifa/item/ef628c50d37345dcd58bac44