其他分享
首页 > 其他分享> > 差分约束系统 学习笔记

差分约束系统 学习笔记

作者:互联网

模板: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

标签:le,space,笔记,约束,ge,CODE,差分,Leftrightarrow
来源: https://www.cnblogs.com/Gokix/p/cha-fen-yue-shu-xi-tong.html