差分约束系统 学习笔记
如果一个不等式组由 \(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}\),因为有负权边)
同时还可以建 \(i\) 到 \(j\) 边权为 \(-k\) 的有向边,跑最长路。
几个转化:
\(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\)
然后建边跑最长路即可。
最后就是记得特判一下,如果在输入时某个小朋友的糖果要比自己多/少,则直接输出无解。