差分约束
有什么L用?
差分约束系统属于线性规划问题。在一个差分约束系统中,线性规划矩阵A的每一行包含一个1和一个-1,A的所有其他元素都为0。因此,由Ax≤b给出的约束条件是m个差分约束集合,其中包含n个未知元。
以上属于没有L用的P话
如果一个辣鸡系统由n个变量 a1...an 和m个约束条件组成,约束条件的形式是全为 ai−aj≤k 或全为 ai−aj≥k 的不等式,则称其为差分约束系统。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
简单的说,用于求一组形式是全为 ai−aj≤k 或全为 ai−aj≥k 的N元不等式组的一组解.
这个不等式组要么无解,要么就有无数组解,每个 ai 都+k,这个不等式组还是成立,因为差是不变的啊~
怎么搞
我们要借助图来解决这个问题
定理:
即对于任何一条边u -> v,都有:
d(v)≤d(u)+w(u,v)
其中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。
将
ai−aj≤k
移一下项,得
ai≤k+aj
然后发现
d(i)≤d(j)+w(j,i)
这个关系和
ai≤k+aj
恰好是吻合的,只要我们将他转化为一个图,使得k=w(j,i),ai和d(i)就是对应的! 这样我们就求出最短路,就相当求出一组解了!
怎么使得k=w(i,j)呢?
若有约束
ai≤k+aj
即连边aj -> ai,边权为k,求最短路
当然我们也可以有大于等于形式的约束
ai≥k+aj
,即连边aj->ai,边权为k,求最长路
(其实就是上面的定理变一下形)
求最短路的话,需要一个源点,手动加一个虚点a0向每个点连一条为0的边就可以了,保证连通.
若图中存在相对的”负权”回路1,则该差分约束系统显然不存在可行解。
注意
一般只有题中显然的条件是不够的,需要自己挖掘一下隐含条件
参考资料
http://blog.csdn.net/xuezhongfenfei/article/details/8685313
- 对于最短路是负权,最长路是正权 ↩