Gokix

一言(ヒトコト)

关注我

差分约束系统 学习笔记

模板:P5960 【模板】差分约束算法

如果一个不等式组由 \(n\) 个变量和 \(m\) 个约束条件组成,形成 \(m\) 个形如

\[x_i-x_j \le k \space (i,j∈[1,n],k \in \mathbb{Z}) \]

的不等式,则称其为差分约束系统。

我们要解决的问题就是:

求出一组 \((x_1,x_2,..,x_n)\) 满足条件的解。


\(x_i-x_j \le k\) 变形成 \(x_i \le x_j+k\)

对比最短路松弛后的情况 \(\forall v,d_v \le d_u+w\),发现二者十分相似。实际上最短路的结果就是差分约束系统的一组解。故对于每个不等式,将其转化为图上一条 \(j\) 指向 \(i\) 的边权为 \(k\) 的有向边。然后建立超级源 \(s\)。将 \(s\) 与每个节点连接一条边权为 \(0\) 的边,之后以 \(s\) 为起点,跑 \(\text{SPFA}\) 即可。如果差分约束系统无解则图上存在负环。(注意不可以用 \(\text{Dij}\),因为有负权边)

CODE

同时还可以建 \(i\)\(j\) 边权为 \(-k\) 的有向边,跑最长路。

CODE


应用:P3275 [SCOI2011]糖果

几个转化:

\(x_i = x_j \Leftrightarrow (x_i\le x_j) \space \land \space (x_i \ge x_j)\)

\(x_i > x_j \Leftrightarrow x_i \ge x_j+1\)

\(x_i < x_j \Leftrightarrow x_j>x_i \Leftrightarrow x_j\ge x_i+1\)

然后建边跑最长路即可。

最后就是记得特判一下,如果在输入时某个小朋友的糖果要比自己多/少,则直接输出无解。

CODE

posted @ 2022-05-17 21:20  Gokix  阅读(17)  评论(0编辑  收藏  举报