差分约束 在数学上 更多被称为线性规划
作为线性规划的一种特殊情况
“差分”即意味两个变量作差
“约束”则意味这个差 满足一些条件
比如 等于某个值 或 大于某个值 或 小于某个值
例 a - b >= x1
b - c <= x2
a - c == x3
而这类问题在计算机中 也一般只会要求你输出 第i个变量与第j个变量 的差 最大是多少 最小是多少
—————————————分界线———————————————
对于 大于等于小于 三种情况 在竞赛中不容易直接让电脑理会并得出需要的结果
差分约束 则是通过 将(不)等式转化为图论中的最短(长)路问题
类比 a - b >= x1 与 dis[a] - dis[b] >= x1 ==> dis[a] >= dis[b] + x1
b - c <= x2 dis[b] - dis[c] <= x2 ==> dis[c] >= dis[b] + (-x2)
a - c == x3 dis[a] - dis[c] <= x3 dis[c] >= dis[a] + (-x3)
dis[a] - dis[c] >= x3 dis[a] >= dis[c] + x3
(1) (2) (3)
——————————————分界线——————————————
如上 将(1) 最终转化成了 (3)
而(3) 则可以通过指定一点的dis为0 (例如 规定dis[a] = 0)
然后从这个点开始求单源最长路
对于dis[c] >= dis[b] + (-x2) 则可以加一条边 从b到c 边权为-x2
因为对于最长路 如果i能转移到j 一定有dis[j] >= dis[i] + w[i][j]
所以这样求出来的单源最长路一定是满足所有式子
1 但是有可能最后求出来 目标点的dis没有被赋值
则说明从起点开始的约束 无法涉及到目标点
即目标点的值与起点的值 没有任何关系 可以为任意值
2 也有可能有一个正环 导致死循环
有正环则说明这一组式子不可满足 例如(a > b + 1 b > a + 1)
____________________________分界线_________________________________________
对于1情况 最终只需要看看dis[final]是不是初始状态就能判断
对于2情况 则限制了求最短(长)路只能用spfa (dij不能有负环)
对于一次spfa 若某个点被访问了N次 则一定有环 (自证不难)便可由此判断
ps : 将上文的(3)组式子也可以改写成 a <= b + x的形式 那么就需要求单源最短路
因为最短路转移维护了 dis[v] <= dis[u] + x
来几道例题练练手吧
poj3169 hdu3440
再来一道不是那么好建图的。。 poj1275
(其实差分约束主要就难在建图。。)