差分约束 学习笔记
过程
差分约束算法可求解不等式组,其中每组不等式形如 \(x_u-x_v\leq w\)。
实际上这是一道图论题。
式子变成 \(x_u\leq x_v+w\),观察这个式子,发现它很像最短路的松弛 \(dis(u)=\min(dis(u),dis(v)+w(u,v))\)。对于每一个不等式,从 \(v\) 向 \(u\) 连边权 \(w\),选一个起点跑 SPFA。如果图中无负环,最终的 \(dis\) 数组不能再松弛,也就是说满足 \(dis(u)\leq dis(v)+w(u,v)\)。那么 \(dis\) 数组就是一组可行解。
为了防止图不连通,建一个超级源点 \(0\),向其他点连边权为 \(0\) 的边,以这个点为起点跑最短路。
如果最短路不存在,即存在负环,则无解。
建图方法
除了上面的方法,还可以把式子变成 \(x_u\geq x_v+w\) 的形式跑最长路。
差分约束的题一般需要变化式子。
套模板后,把可行解整体加上解的最小值即可。但是可以省掉后面的一步:
建超级源点其实增加了 \(n\) 组约束条件 \(x_i-x_0\leq 0\),跑最短路求出的解是满足 \(x_i\leq x_0\) 的最大解。同理跑最长路求出的是满足 \(x_i\geq x_0\) 的最小解。
这一题把式子变为 \(t_j\geq t_i-b\) 跑最长路,将 \(dis_0\) 设为 \(0\) 即可。
\(x_u\geq x_v+w\):\(x_v\leq x_u-w\)
\(x_u=x_v\):\(x_u\leq x_v+0\),\(x_v\leq x_u+0\)
\(\sum_{i=l}^{r}a_i=w\):\(sum_r-sum_{l-1}=w\),\(sum_r\leq sum_{l-1}+w\),\(sum_{l-1}\leq sum_r-w\)
\(x_u\geq(k-t)x_v\):\(\log (x_u)\geq\log (x_v)+\log(k+t)\)
\((k+t)x_u>x_v\):\(\log (x_u)>\log (x_v)-\log(k-t)\)
\(x_u=k\):\(x_0=0\),\(\log(x_{0})\geq\log(x_u)+\log(k)\),\(\log(x_u)\geq \log(x_{0})-\log(k)\)
[[图论]]

浙公网安备 33010602011771号