[線性規劃與網路流24題] 網路流常見模型
最近兩個月在做《線性規劃與網路流24題》這套題,加深了對網路流的理解。
涵蓋到的模型有:二分圖匹配、二分圖的最大獨立集、最大權閉合圖、有向無環圖的最小路徑覆蓋、最多不相交路徑、最大權不相交路徑、區間k覆蓋、最短路。第13題涉及到與二分法的結合(其實也可以逐層列舉)。
二分圖匹配
設二分圖G=(V, E)的兩個頂點集為X, Y。
- s->Xi,費用為0,按需賦容量。
- Xi->Yj,(Xi, Yj)屬於E,費用為邊權,按需賦容量。
- Yj->t,費用為0,按需賦容量。
求(最小費用)最大流。
二分圖的最小覆蓋集
點權之和最小的覆蓋集
- s->Xi,容量為點權。
- Xi->Yj,(Xi, Yj)屬於E,容量為inf。
- Yj->t,容量為點權。
求最小割,由最大流最小割定理,求解最大流即可。
定義不包含容量為inf的邊的割為簡單割。本網路中,最小割是簡單割。
什麼叫覆蓋集?對於每條邊,其兩端點至少有一個被選中。割的性質是不連通:任何一條s-t路徑上,至少有一條邊屬於割集。這裡所有的s-t路徑由3段構成,中間的Xi->Yj容量為inf,不屬於簡單割。因此,二分圖的覆蓋集和簡單割一一對應。最小割是容量最小的簡單割,也是點權之和最小的覆蓋集。
對於不帶權的二分圖圖,令所有點點權=1。以這種方式我們求出的是其最小覆蓋集,也是其最大匹配。因而,我們證明了König定理:二分圖的最大匹配等於最小覆蓋。
頂點數最多且點權之和儘量大的覆蓋集
- s->Xi,容量為1,費用為點權的相反數。
- Xi->Yj,(Xi, Yj)屬於E,容量為inf,費用為0。
- Yj->t,容量為1,費用為點權的相反數。
求最小費用最大流。
二分圖的最大獨立集
最小覆蓋集和最大獨立集是互補問題。
覆蓋集:對於每條邊,至少選一個端點,即至多不選一個端點。
獨立集:對於每條邊,至多選一個端點,即至少不選一個端點。
求最大獨立集,等價於求其補集,也就是說每條邊刨出至少一個端點,並且刨出的點的權和最小,這樣才使剩下的最多。|最大獨立集|+|最小覆蓋集|=所有點的權值之和。
最大權閉合圖
設正權點的集合為V+,負權點的集合為V-。
- s->u,u∈V+,容量為點權的絕對值。
- u->v,(u, v)∈E,容量為inf。
- v->t,v∈V-,容量為點權的絕對值。
求最小割,用正權點減去割的容量即得最大的權。
可行性方面,簡單割和閉合圖一一對應。設簡單割為[S, T],S-{s}即為閉合圖中的點。
簡單割對應閉合圖:反證。假設存在u∈S-{s},v∈T-{t},且(u, v)∈E。因為(u, v)∈E,所以網路N=(V’, E’)中存在(u, v)∈E’且c(u, v)=inf。又因為u, v分屬s, t,所以這條邊屬於[S, T],與簡單割的假設矛盾。
閉合圖對應簡單割:反證。假設[S, T]不是簡單割,那麼存在u∈S-{s},v∈T-{t},且c(u, v)=inf。這隻會當存在(u, v)∈E時發生,與閉合圖的假設矛盾。
數量關係方面,最小割意味著最小化“刨開的正權+保留的負權的絕對值”。用正點權之和去減,得到“保留的正權-保留的負權的絕對值=保留的正權+保留的負權”。
有向無環圖的最小路徑覆蓋
- s->Xi,容量為1。
- Xi->Yj,(i, j)∈E,容量上界為1。
- Yi->t,容量上界為1。
DAG的最小路徑覆蓋=|V|-對應二分圖的最大匹配。
約束是什麼?對路徑的定義中,有至關重要的一點:允許長度為0。於是解的存在性得到了保證。因此,只需滿足:對於任意一點,至多有一條與它關聯的入邊和與它關聯的出邊被選中。
二分圖的匹配,可以從頂點對應的角度看待,也可以從邊的角度看待:選出一些邊,使得每個頂點至多與一條邊關聯。和本問題的約束對比,發現有向無環圖不是二分圖,並且對於頂點而言,邊分為入邊和出邊兩類。考慮把點i拆成Xi、Yi,入邊連到Yi,出邊從Xi出發。這樣,問題的約束便和二分圖匹配相一致。
目標是什麼?使路徑覆蓋數最小。除了直接數,還能用什麼來刻畫路徑覆蓋數?頭的數量或尾的數量。什麼樣的點是頭?沒有匹配邊與對應的Yi關聯。尾?沒有匹配邊與對應的Xi關聯。所以,DAG的最小路徑覆蓋=|V|-對應二分圖的最大匹配。
hzwer這兒有另一種更簡潔的看待方法:
如果無匹配,顯然要n條路徑才能覆蓋所有點,兩個點匹配意味著將可以把它們用一條路徑覆蓋,路徑數就可以減1
我還有一種另類看待方法:
帶上下界的網路流。
Step 1
- s->Xi,容量上界為1。
- Xi->Yi,容量下界為1,上界inf。
- Yi->Xj,(i, j)∈E,容量上界為1。
- Yi->t,容量上界為1。
求解s-t最小流。
Step 2
看出一個可行流,於是省去通常求解s-t可行流的步驟。
網路變換為:
- Xi->s,容量上界為1。
- Yi->Xj,(i, j)∈E,容量上界為1。
- t->Yi,容量上界為1。
此網路的t-s最大流與原s-t可行流的疊加,即為原s-t最小流。s-t可行流的值為|V|,用|V|去減t-s最大流即可。
這種看待方法和hzwer的在實質上相同,但是是從形式上的變換得到的。
為什麼強調DAG?因為我們只是簡單地拆點、匹配,而沒有在意這兩點是否已經在同一條路徑裡了。比如,一個環,對應二分圖的最大匹配為|V|,實際上,作為一條有始有終的“路徑”,它是不能封口的。
最多/最大權不相交路徑
在原圖上改造,用容量1描述“不相交”的約束,用源、匯發出、接受的容量限制最大權不相交路徑問題中路徑的條數。若要求頂點也不相交,可採用拆點的手段給結點賦容量。
最短路
把狀態看作頂點,狀態的轉移看作邊,邊權是轉移的代價。如果一個問題有最優子結構、重疊子問題兩個性質,令你很想使用動態規劃方法,卻苦於無法確定計算順序,那麼不妨嘗試最短路模型。有時,用不著把圖存起來,把轉移寫在最短路過程裡即可。這樣免去了分層圖的一些麻煩,也提高了程式的時間效率。
狀態是什麼?哪些量能簡潔而完整地刻畫它?狀態之間的轉移關係是怎樣的?
區間k覆蓋
- 離散化。
- s->P1,容量為k,費用為0。
- Pi->P(i+1),i
二分法
做過兩道與之有關的題目:[HNOI2007]緊急疏散evacuate、[CTSC1999]家園。從劉汝佳老師的書上學習了“公平分配問題”。
前兩題的一個共性是相對論的四維時空觀:按時間拆點,體現了分層建圖的思想。
可以通過比較流量和待分配的數目,判定此次嘗試的成功與否。可以通過修改一些邊的容量、修改圖的層數,為新的一輪嘗試做準備。
有時,無解的判定、二分上下界的確定成為問題。比如家園一題。我判定無解的方式是,先在三維空間內建圖,判定地球、月球是否連通。如果連通,總存在一種方案拯救人類,因為可以等待。但是我估算的二分範圍太鬆了,導致最後一組TLE。在題解的啟發下,將上界和某常數取min……不少題解是列舉的,迴圈到某個常數便停止(說只是TLE和WA的區別……),於是便省去了估算範圍這一步驟。由於增廣路演算法本身就是在一遍遍迭代,這樣逐層列舉,由於先前的殘存網路尚在,也取得了不錯的時間效率。
在CodeVS 1034的題解頁面還發現了一個費用流解法(Solution_ID:4685 by 6755),使人們走較近的路去月球,最後判斷最後走過的從月球到匯點的邊。但這樣一開始就得建很多層圖,需要對答案範圍的敏銳感知。
提交記錄裡時間差異挺大的……有2ms,有幾十ms,有像我這樣上百ms。