差分约束系统
差分约束系统用于求解 \(n\) 元不等式组的解,对于 \(n\) 个变量 \(x_n\) ,能写出形如 \(a \leq x_i - x_j \leq c\) 这样的不等式(左右两边不一定同时存在),就可以使用差分约束求出一组解。
原理
可以发现差分约束的解只有无解和无限解两种情况,对于一组特解 \(x_1,x_2 \cdots x_n\) ,解 \(x_1+d,x_2+d,\cdots x_n+d\) 也是一组解。
对于不等式 \(x_i - x_j \leq c\) ,这和最短路的三角不等式 \(d_v \leq d_u + w\) 相似,我们可以连接有向边 \((j,i,c)\)。
差分约束系统建立在一个确定的变量基础上,即,我们需要建立超级源点(通常设为 \(x_0\)),对每个点连边。我们建立不等式 \(x_i - x_0 \leq 0\),即有向边 \((0,i,0)\)。
对于图上从 \(0\) 到 \(u\) 的一条路径,将路径上的边权全部相加,可以得到 \(x_u - x_0 \leq \sum w\),得到 \(x_u \leq \sum w + x_0\) ,我们将 \(x_0\) 设为 \(0\),能求得 \(x_u\) 满足这一条不等式链的最大取值,对于所有从 \(0\) 到 \(u\) 的路径,其最短路即为 \(x_u\) 的全局最大值。
当然,设置不同的 \(x_0\) ,可以得到不同的 \(x_i\) 的偏移,当 \(x_0=0\) 时,能得到 \(x_i\) 不大于 \(0\) 的一组解。
上述求解的是最大值,一些题目要求解最小值,需要考虑不等式 \(a \leq x_i-x_j\),和最长路的三角不等式 \(d_v \geq d_u +w\) ,还是连边 \((j,i,a)\) ,只不过这次求解的是最长路。对于超级原点有 \(x_i-x_0 \geq 0\),连边 \((0,i,0)\),此时求最长路能得到每个变量的最小值。
更进一步,我们求出的是每个点在满足所有不等式条件后,和 \(x_0\) 差值的最值,和其他变量均没有关系。因此,所有变量的最值就是全局的最优解。例如求所有变量和的最值,那答案即为所有变量最值的和。
例题
给出 \(m\) 个区间 \([l_i,r_i]\),值域在 \([1,n]\) 中,给 \([1,n]\) 选定最少数量的点,使得每个区间内都有至少 \(c_i\) 个点被选定。
设前缀和为 \(p_i\),有不等式 \(0 \leq p_i-p_{i-1} \leq 1\) ,\(p_{r_i}-p_{l_i-1} \geq c_i\) ,对于 \(p_i-p_{i-1} \leq 1\),转换后得 \(p_{i-1}-p_i \geq -1\),于是连边后求最长路即可。此时超级源点只需要连边 \((0,1)\) 即可,因为整张图都是连通的。