1. 程式人生 > 其它 >基於最短路的差分約束模型

基於最短路的差分約束模型

1. 差分約束的功能

  • 不等式組的可行解
  • 滿足不等式組每一個變數的最值

不等式組中每一個不等式形式如下:

\[x_i ≤ x_j + c_k \]

其中,\(x_i\)\(x_j\) 是自變數, \(c_k\)是因變數。

我們可以類比一下之前的最短路問題,假設存在一條從 j jj 走到 i ii,邊權為 c cc 的邊。在進行最短路計算時,只要遇到 d i s t [ j ] > d i s t [ i ] + c dist[j] > dist[i] +cdist[j]>dist[i]+c,我們就將 d i s t [ j ] dist[j]dist[j] 更新為 d i s t [ i ] + c dist[i] + cdist[i]+c。因此,當做完最短路之後,對於所有的 j jj,都有 d i s t [ j ] ≤ d i s t [ i ] + c dist[j] ≤ dist[i] + cdist[j]≤dist[i]+c

如果給我們一個圖,我們可以把每條邊看成一個不等式,那麼我們在這個圖上求一遍起點到所有點的最短距離(注意從起點出發,一定能走到所有的邊),求完之後每個邊的不等式都是滿足的。那麼,任何一個最短路問題,都可以轉換為一個不等式組。那麼反過來也一樣,一個不等式組也可以轉換為一個最短路問題。

因此,我們在解不等式組問題的時候,遇到一個不等關係,就將它處理成為 x i ≤ x j + c k x_i ≤ x_j + c_kx
i

≤x
j

+c
k

的格式,然後建立 j → i j→ij→i 權值為 c k c_kc
k

的一條邊。之後我們在這個圖上,隨便選擇起點(該起點需要滿足從該點出發,一定可以走遍所有的邊),求一下每個點到起點的最短距離,求完之後,所有的不等關係都會滿足。

  1. 求不等式的可行解
    綜上所述,我們可以總結出差分約束求不等式可行解的做法:

源點需要滿足的條件:從源點出發,一定可以走到所有邊(某個點走不到沒有關係,因為從數學的角度,某個點就是某一個變數,既然沒有邊與它相連,它就沒有任何約束)。

步驟:
【1】先將每個不等式 x i ≤ x j + c x_i ≤ x_j + cx
i

≤x
j

+c 轉換成一條 j → i j→ij→i 長度為 c cc 的一條邊
【2】找一個虛擬源點,使得該源點一定可以遍歷到所有邊
【3】從虛擬源點求一遍 單源最短路

注意:
並不是所有圖都存在最短路,圖中可能存在負環,如果存在負環對應到不等式中就是無解。

因此,建圖完畢以後,做一次最短路,只有兩個結果:
(1)如果存在負環,那麼該不等式組一定無解
(2)如果不存在負環,則 d i s t [ i ] dist[i]dist[i] 就是原不等式組中 x i x_ix
i

的一個可行解

  1. 求滿足不等式組中每一個變數的最值
    只記結論: 如果求的是最小值,則應該求最長路;如果求的是最大值,則應該求最短路。為什麼呢?以求 x i x_ix
    i

    的最大值為例:求所有從 x i x_ix
    i

    出發,構成不等式鏈 x i ≤ x j + c 1 ≤ x k + c 2 + c 1 ≤ . . . ≤ . . . ≤ c 1 + c 2 + . . . + c k x_i≤x_j+c_1≤x_k+c_2+c_1≤...≤...≤c1+c2+...+c_kx
    i

    ≤x
    j

    +c
    1

    ≤x
    k

    +c
    2

    +c
    1

    ≤...≤...≤c1+c2+...+c
    k

    ,通過做最短路以後可以確定 x i x_ix
    i

    的一系列上界,最終 x i x_ix
    i

    的最大值就等於所有上界中的最小值。

最長路的建圖方式和2節中最短路的建圖方式一樣,把不等式轉換成 x i ≥ x j + c x_i ≥ x_j + cx
i

≥x
j

+c, 建立一條 j → i j→ij→i 長度為 c cc 的一條邊(最短路只看≤,最長路只看≥)。

我們知道,如果不等式組中僅僅包含不同變數之間的大小關係,那麼我們求出的可行解一定是一個包含變數的相對關係,它不存在一個極值的概念。

因此,一旦題目讓我們求滿足不等式關係的極值,那麼一定會在不等式組中加入形如 x i ≤ c x_i ≤ cx
i

≤c 或 x i ≥ c x_i ≥ cx
i

≥c 這樣的條件(小於還是大於看求最短路還是最長路),這樣才能確定最後不等式組的邊界,得到極值。那麼,如何處理形如這種單變數常數關係呢?

【問題】如何轉化形如 x i ≤ c x_i ≤ cx
i

≤c,其中 c cc 是一個常數的這類關係?
答:建立一個虛擬源點 0 00,轉換為 x i ≤ x 0 + c x_i≤x_0+cx
i

≤x
0

+c,然後建立 0 → i 0→i0→i,長度是 c cc 的邊。