差分约束系统
先来看一道例题
现有未知数 a1,a2,⋯,an ,有若干个形如 ai−aj≤k 的不等式构成的不等式组,求解这个不等式组的一组解。
一眼看下去,好像很难入手。
我们先把不等式整理一下:
ai−aj≤k=ai≤aj+k
等一下,是不是有点熟悉?
对于一个图的最短路,我们设
disi
表示源点到
i
的最短路,那么如果
等等,你发现了什么?
没错,对于这个不等式组,我们可以像图的最短路问题一样连边(
ai−aj≤k
即
点j到
点
i
连一条边权为k的单向边),然后设一个源点
像这样,由
n
个变量,有若干个形如
再来看一组例题:
设有n个盒子标号为1…n,每个盒子最多放1个球。其中有若干个 [ai,bi,ci] 表示 ai ~ bi 最多可放 ci 个球,求这n个盒子最多可放多少个球。
这就是典型的求解有若干个形如 ai−aj≤k 条件约束的差分约束系统。
我们设
Si
表示
1
~
0≤Sbi−Sai−1≤ci
0≤Si−Si−1≤1
按照上述方法连边,做一次最短路,所得的 disn 就是答案(可以证明一下为什么)。
至此我们大概了解了差分约束系统及其应用,这里还有一道例题:DY引擎。