差分约束
差分约束
用来求解一组\(n\)元不等式的一组解
\[\left\{
\begin{matrix}
x_{k_1} <= x_{k_2} + d_1\\
x_{k_3} <= x_{x_4} + d_2\\
x_{k_5} <= x_{k_6} + d_3\\
\end{matrix}
\right.
\]
以上的不等式组形式上非常像最短路算法中的松弛操作,基于此,我们可以从\(k_2\)向\(k_1\)建一条边权为\(d_1\)的有向边,从\(k_4\)向\(k_3\)建一条边权为\(d_2\)的有向边……
举个具体点的例子
我们有如下不等式:
\[\left\{
\begin{matrix}
x_3 <= x_1 - 1\\
x_3 <= x_2 + 2\\
x_2 <= x_1 + 3\\
\end{matrix}
\right.
\]
则可以构造出如下的有向图
我们可以跑一遍最短路(无所谓源点)来求出一组可行解的。
但是有些时候根据不等式构建出的有向图存在负环。比如如下这组不等式:
\[\left\{
\begin{matrix}
x_1 <= x_2 - 1\\
x_2 <= x_1 - 1\\
\end{matrix}
\right.
\]
和容易发现这组不等式是无解的,这说明了在我们构造的有向图可以通过判断是否存在负环来判断原不等式是否存在可行解。
另外地,如果有些时候图无法连通,或者是添加了一个点的具体信息,如\(x_i = 0\),这是我们往往会引入一个虚点(将其作为源点,求出一个特定的解)。以上个图为例,对于前者,我可以添加如下不等式来使得图连通(这里的\(x_0\)如果定义为\(0\),那就成了求解最大的非正解,想求出最大的非负解,应该转换不等式,跑最长路):
\[\left\{
\begin{matrix}
x_1 <= x_0 + 0\\
x_2 <= x_0 + 0\\
x_3 <= x_0 + 0\\
\end{matrix}
\right.
\]
对于后者,我们可以添加类似如下不等式,这里需初始化\(x_0=0\):
\[\left\{
\begin{matrix}
x_0 = 0\\
x_3 <= x_0 + 0\\
x_0 <= x_3 + 0\\
\end{matrix}
\right.
\]
总结一下:
跑最短路或者最长路(本质都是相同的,但是在求存在解的最大可能值时跑最短路,反之跑最长路)
无解的情况时有向图存在负环或者正环
几个例题:
P5960 【模板】差分约束算法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)