差分约束 学习笔记

过程

差分约束算法可求解不等式组,其中每组不等式形如 \(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\) 的形式跑最长路。

差分约束的题一般需要变化式子。

P1260

套模板后,把可行解整体加上解的最小值即可。但是可以省掉后面的一步:

建超级源点其实增加了 \(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\) 即可。

P1993

\(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\)

P2294

\(\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\)

P4926

\(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)\)

[[图论]]

posted @ 2024-03-01 09:38  lgh_2009  阅读(13)  评论(0)    收藏  举报