学习笔记 【差分约束】
差分约束
差分约束系统 是一种特殊的 \(n\) 元一次不等式组,它包含 \(n\) 个变量, 以及 \(m\) 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 \(x_i-x_j\leq c_k\)。
我们要解决的问题是:求一组解 ,使得所有的约束条件得到满足,否则判断出无解。
差分约束系统中的每个约束条件 \(x_i-x_j\leq c_k\) 都可以变形成 \(x_i\leq x_j+c_k\) ,这与单源最短路中的三角形不等式 \(dis[\,y\,]\leq dis[\,x\,]+z\) 非常相似。因此,我们可以把每个变量 \(x\) 看做图中的一个结点,对于每个约束条件 \(x_i-x_j\leq c_k\) ,从结点 \(j\) 向结点 \(i\) 连一条长度为 \(c_k\) 的有向边。
对于\(≤\)号,我们跑最短路,否则跑最长路。
对于一些对解有要求的问题,我们建一个超级原点,对于 \(x_i-x_0 \leq c_0\) 我们设置的 \(c_0\) 为解的上限,若是大于等于则 \(c_0\) 为下限。
但在建图后不一定存在最短/长路,因为可能存在无限减小/增大的负环/正环,此时就是无解的情况。
解法:
- 根据题中的关系推出一些隐含的关系式。
- 进行建图。
不等式标准化:
如果要求取最小值,那么求出最长路,那么将不等式全部化成 $ x_i - x_j ≥ k $的形式,这样建立 \(j->i\) 权值为 \(k\) 的边,如果不等式组中有 \(x_i - x_j > k\),因为一般题目都是对整形变量的约束,化为 \(x_i - x_j ≥ k+1\) 即可,如果 \(x_i - x_j = k\)呢,那么可以变为如下两个:\(x_i - x_j ≥ k\) , \(x_i - x_j \leq k\),建立两条边即可。
建好图之后直接\(\text{spfa}\)或\(\text{bellman-ford}\)求解,不能用\(\text{dijstra}\)算法,因为一般存在负边,注意初始化的问题。

浙公网安备 33010602011771号