1. 程式人生 > 遊戲資訊 >符文之地的故事:永凍的極寒之地-弗雷爾卓德

符文之地的故事:永凍的極寒之地-弗雷爾卓德

差分約束

用來求解一組\(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)

P1993 小 K 的農場 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

[P4926 1007]倍殺測量者 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)