網絡流常見建圖套路總結(重制版)


網絡流常見建圖套路總結(重制版)

前置知識

  1. 網絡流的基本算法:Dinic最大流,EK+SPFA求費用流
  2. 最小割,最小割最大流定理
  3. 二分圖判定,匹配,相關性質

由於本文以建圖方法為主,不涉及網絡流算法的具體實現,以上前置知識一邊看一邊學也可以
60029409_p0_master1200.jpg

最大流

二分圖最大匹配與多重匹配

二分圖匹配:給定一個二分圖G,在G的一個子圖M中,M的邊集{E}中的任意兩條邊都不相交,則稱M是一個匹配。二分圖最大匹配則是使邊數最多的匹配

二分圖多重匹配:每個節點不一定只與一條邊相連,而是限制了最多連的邊數(當限制為1時退化為二分圖最大匹配

t

建圖方法:

對於一張二分圖,我們可以從源點S向左部節點連有向邊,右部節點向匯點T連有向邊,原二分圖每條邊看作從左到右的有向邊
假如把所有邊的流量設為1,則二分圖的最大匹配數就等於S到T最大流,所有有流經過的邊為匹配邊

t

如果要求二分圖多重匹配,則只需把S向左部點的有向邊容量設為左部點匹配數量上限,右部點同理

二分圖一般匹配:飛行員配對方案問題

二分圖多重匹配:圓桌問題

試題庫問題

二分圖的建模有兩個要素:

  1. 0要素:能分成兩個不相交的點集
  2. 1要素:一個點只能與一條邊相連

最小路徑覆蓋

最小路徑覆蓋:在一個有向無環圖中,找出最少的路徑,使得這些路徑經過了所有的點。最小路徑覆蓋分為最小不相交路徑覆蓋最小可相交路徑覆蓋,區別是這些路徑是否可以相交

最小不相交路徑覆蓋

建圖方法:把原圖的每個點u拆成兩個點\(u_1,u_2\),如果有一條有向邊\((a,b)\),則連邊\((a_2,b_1)\),容易發現這是一個二分圖,那么用下面的定理就可以求出答案

定理: 最小路徑覆蓋=原圖節點數-新圖最大匹配數

證明

一開始每個點都是一條路徑,每次找一條匹配邊,代表合並兩條路徑

由於路徑不相交(即每個點的入度和出度至少有一個為1),所以二分圖上的邊也不相交(如果相交則說明某個點的入度或出度大於1),這正好是匹配的定義

每條匹配邊代表答案-1,所以最小路徑覆蓋=原圖節點數-新圖最大匹配數

最小可相交路徑覆蓋

對原圖傳遞閉包,即若原圖中\((u,v)\)連通,則增加邊\((u,v)\).這可以用Floyd算法\(O(n^3)\)實現。然后對新圖做最小不相交路徑覆蓋即可。因為在原圖中相交的路徑在傳遞閉包后可以拆分成另一條邊,這樣就不相交了

最小路徑覆蓋:
最小路徑覆蓋問題

魔術球問題

最多不相交路徑

這種問題變化比較多,但都能表示成以下形式:

已知一些路徑,每個節點只能屬於一條路徑,求能選擇多少條路徑使它們不相交.

主要的方法是拆點,將一個點拆成兩個,然后連邊,容量表示該點最多經過次數

最長遞增子序列問題

最小割

最大權閉合子圖

定義:有一個有向圖,每一個點都有一個權值,選擇一個權值和最大的子圖,使得每個點的后繼都在子圖里面,這個子圖就叫最大權閉合子圖。

t

如圖,括號外的為點的編號,括號內的為點的權值,則閉合子圖有{1,2,3,4} {2,4} {3} {4}{空},最大的閉合子圖是{1,2,3,4},權值和為9

建圖方法:

從源點s向每個正權點連一條容量為權值的邊,每個負權點向匯點t連一條容量為權值的絕對值的邊,有向圖原來的邊容量全部為無限大。

t

定理:最大權閉合子圖=所有正權點之和-最小割
證明:

關鍵性質:如果s與i有邊,表示i在子圖中。如果i與t有邊,表示i不在於子圖中。即:割掉s與i表示不選i,割掉i與t表示選i。

性質1:原圖之間的邊一定不會被割掉

​ 邊權為無窮大,當然不會被選進最小割

性質2:只有s到t不聯通時,才得到最大權閉合子圖

​ 反證法:若s到t連通,則一定存在節點i,j使s到i有邊,i到j有邊(引理1),j到t有邊.而根據性質1:i在子圖中,j不在子圖中,這與最大權閉合子圖的定義矛盾,證畢
由引理2可得,圖的一個割就是一個閉合子圖

由於\(一個割的邊權和=不選的正權點+選的負權點絕對值=不選的正權點-選的負權點\).

\[\begin{aligned} 閉合子圖 &=正權點+負權點 \\ &=所有正權和-不選的正權點+選的負權點 \\ &=所有正權和-割的邊權和 \end{aligned}\]

顯然割的邊權和最小的時候得到最大權閉合子圖,證畢

應用:

當問題中出現一種沖突時,就可以采用最大權閉合子圖。具體來說,對於一個事件,只能得到a收益和b收益之中的一種。我們就把a收益作為正權點,b收益作為負權點,跑最大權閉合子圖

[AGC038F]Two Permutations

BZOJ4657

二分圖獨立集

定理: 二分圖最大獨立集=n-二分圖最大匹配

其實二分圖獨立集是特殊的一種最大權閉合子圖。我們根據上文“收益”的思想,把選某個點的收益看為1,左部節點為正權點,右部節點為負權點.按照最大權閉合子圖的方式建圖,答案為正權和-最小割=n-最小割=n-最大流。我們發現把最大權閉合子圖中INF的邊換成1也不影響答案,因為圖中其他邊的容量都為1。這樣圖就變成了二分圖匹配中的圖,最大流=二分圖最大匹配

例題:

方格取數問題

騎士共存問題

最大密度子圖

定義:圖的密度是圖上的邊的數量除以點數。求密度最大的子圖。

建圖:看到平均數想到01分數規划。二分答案\(mid\),那么問題轉化為判定是否存在一個子圖,使得\(邊數-mid\cdot 點數>0\).那么可以把每條邊的權看成1,每個點的權看成\(-mid\),限制是選擇一條邊就必須選擇邊連接的兩個點。於是把邊看成左部點,點看成右部點,跑最大權閉合子圖,若答案\(>0\),則合法。

二元關系最小割模型

定義:有若干個變量,每個變量有2種取值,有若干個現在,每個限制形如"若變量x=a,y=b,就要付出c的代價"。最大化所有變量的值之和減去最小代價。

建圖:每個變量建一個點,S到x連邊表示x的一種取值的代價,x到T連邊表示x的另一種取值的代價。對於一個限制,在兩個點之間連邊。邊權需要列方程解出。

例題:[國家集訓隊]happiness

平面圖最小割

定義:平面圖是指能夠所有邊畫在一個平面上使得每條邊僅在頂點處相交的圖.現在給出一張邊帶權的平面圖與起點和終點,求一個邊權和最小的邊集,使得去掉這個邊集后起點和終點不連通。

建圖:

1001.jpg

我們發現,如果把每個平面區域看成一個點,交界處的邊看成連接兩個區域的邊,再加兩個點表示分割線的起點和終點、那么原圖的一個割就對應新圖的一條路徑。如圖上S->(1)->(4)->(9)->(10)->T就構成了一個分割線,割斷的邊權為5,6,3,6,5.因此原圖的最小割就等價於新圖上的最短路,我們將新圖稱為這個平面圖的對偶圖。也就是說,平面圖最小割=對偶圖最短路

對於一般的平面圖,找出這些區域需要一些計算幾何的知識,這里不(wo)再(ye)贅(bu)述(hui).但是很多題目中出現的圖往往是有規律的,比如網格圖.那么就可以直接建圖跑最短路求解,往往能獲得比網絡流優的多的復雜度。

例題:[BZOJ1001]狼抓兔子

最小割的方案

求最小割的邊集。

最小割的可行邊

定理:邊\((u,v)\)是可行邊,當且僅當\((u,v)\)滿流,且殘量網絡上不存在\(u\)\(v\)的路徑

如果還有路徑,說明可以繼續增廣,

注意到\((u,v)\)滿流時\((v,u)\)在殘量網絡上,那么判定定理也可以寫成:\((u,v)\)滿流,且殘量網絡上\(u,v\)不在同一個強連通分量(SCC)里

我們將SCC縮點,那么新圖的任意最小割都是原圖的最小割,其中肯定有把\(u,v\)所在SCC割開的最小割。這就證明了上述定理.

代碼實現上可以Tarjan縮點,但是直接BFS似乎跑的也很快

最小割的必須邊

同上求SCC,設\(id_x\)\(x\)的SCC編號。

定理:對於滿流邊\((u,v)\),若\(id_s=id_u\)\(id_v=id_t\),那么邊\((u,v)\)是必須邊。

證明:如果一條邊是必須的,那么增加這條邊的容量一定會改變最大流。
殘量網絡的SCC縮點后是一個DAG,方向是從T向S
當且僅當\((u,v)\)剛好在\(id_s\)\(id_t\)之間時,增加\((u,v)\)的流量才能增大最大流。

最小割任意方案和字典序最小方案

依次枚舉每條邊(枚舉順序不同,方案也不同).每次選取一條滿流邊\((u,v)\),用BFS判斷它是否是可行邊。如果是就加入最小割。考慮經過\((u,v)\)的增廣路,這條路上的滿流邊也可能成為割邊,這樣就會和\((u,v)\)重復。因此要退回這些邊的流量,讓它們不滿流,就不會被選進去了。具體方法是從\(u\)\(s\),\(v\)\(t\)跑一次Dinic,相當於把流量流回去,這一步被稱為退流

如果讓字典序最小,就按編號從小到大枚舉即可。題目要求的特定順序也類似.

最小割最小邊數方案

跑完一次最小割后,令所有滿流邊容量為1,非滿流邊容量為\(+\infty\).再做一次最小割,此時的任意最小割方案割邊都最少。

[SDOI2014]LIS

分層圖最短路與最大流

分層圖最短路

分層圖是一種狀態是多維的的圖,它是由一個圖不斷復制形成的

t

這就是一個分層圖,它由圖{1,2,3}復制了三次形成

通常情況下須要用到分層圖的題目都有一些操作,操作可能會改變邊權或者連邊方式,我們的解決方法就是把原圖復制,然后修改,並在不同層次圖的點之間連起新的邊。 每一層圖都是由原圖復制來的。因此這些不同層次的圖的結構和性質類似

在實現上,鄰接表里不一定要存儲所有的邊,可以只存儲原圖,但是一些數組用二維數組來表示,如\(dist[i][u]\)表示第i層的u號節點

這是分層圖上的spfa算法的(偽)代碼

struct node{
    int floor;//層數
    int num;//節點編號
}
queue<node>q;
int dist[maxl][maxn];//距離
int inq[maxl][maxn];//是否在隊列種
int spfa(node s,node t){
   q.push(s);
   memset(dist,0x3f,sizeof(dist));
   dist[s.floor][s.num]=0;
    while(!q.empty()){
        node x=q.front();
        q.pop();
        inq[x.floor][x.num]=0;
        for(y : 從x可以到達的節點){
            if(dist[y.floor][y.num]>dist[y.floor][y.num]+w){//w為轉移代價
                dist[y.floor][y.num]=dist[y.floor][y.num]+w;
                if(!inq[y.floor][y.num]){
                    inq[y.floor][y.num]=1;
                    q.push(y);
                }
            }
        }
    }
    return dist[t.floor][t.num];
}

很多時候分層圖最短路也可以通過BFS解決,但SPFA會稍快一些

軟件補丁問題

分層圖最大流

建圖:把分層圖加上流量即可
例題:家園

費用流

費用流的建圖一般沒有固定套路,要根據具體問題在流上加上費用。在處理費用流的情況下,一定要注意一點:EK+SPFA求的是在流量最大的前提下的最小費用,有時會發現建圖不需要滿足流量最大,此時要考慮改變建圖方式或使用有上下界的費用流。

另外,費用流的復雜度較高,Dinic能跑過的單路增廣+SPFA未必能跑過,可以考慮多路增廣+SPFA或zkw費用流。

二分圖帶權匹配

定義:每條邊有邊權,求匹配邊權值之和最大的匹配
建圖:在邊上加上權,跑費用流即可

最大權不相交路徑

定義::每條路徑有一個權值(一般是邊權和),在不相交路徑數最多的情況下,最大化費用
建圖:同最多不相交路徑,在連接兩個拆點的邊上加上費用跑費用流即可

不等式差分模型(網絡流解線性規划)

定義:對於一些不太好直接想到建圖的問題,我們可以數學建模,列出方程然后用線性規划求解。這樣的好處是思維量較小,只要做代數變換就可以建圖,而不用考慮建圖的實際意義。我們需要把式子做差,使得每個未知數僅在兩個等式中出現。
根據網絡流中每個點流量平衡的思想,我們可以把\(−x_i\)看成從點\(i\)流出xi的流量,\(+x_i\)看成流入\(x)i\)的流量。等式為0就代表流量平衡。

建圖:

  • 每個等式為圖中一個頂點,添加源點S和匯點T。

  • 如果一個等式右邊為非負整數c,從源點S向該等式對應的頂點連接一條容量為c,權值為0的有向邊;如果一個等式右邊為負整數c,從該等式對應的頂點向匯點T連接一條容量為c,權值為0的有向邊。

  • 如果一個變量\(x_i\)在第j個等式中出現為\(x_i\),在第k個等式中出現為\(-x_i\),且在目標函數里的系數為\(c_i\),從頂點j向頂點k連接一條容量為\(+\infty\),費用為\(c_i\)的有向邊。

  • 如果一個變量\(y_i\)在第j個等式中出現為\(y_i\),在第k個等式中出現為\(-y_i\),且在目標函數里沒有出現,從頂點j向頂點k連接一條容量為\(+\infty\),權值為0的有向邊。

例題:志願者招募

例題:餐巾計划問題

有上下界的網絡流

無源匯有上下界可行流

定義: 無源匯網絡指的是沒有源點和匯點,每個點都有入邊和出邊且滿足流量守恆的網絡。在這個網絡上求一個流量方案,使得每條邊的流量必須在\([l_i,r_i]\)之間,且每個點流量守恆。

有上下界的費用流的核心是"補償"。我們先假設每條邊的流量均為\(l_i\),那么一定會有一些點流量不守恆。現在我們需要構造一個附加網絡,使得把附加網絡和原網絡疊加(即對應邊流量相加)之后的圖滿足流量守恆

因為Dinic只能求有源匯最大流,所以是不能直接求出附加網絡的流量的。那么我們可以在附加網絡上添加一些不在原網絡上的邊和點,來實現我們的限制.

\(d_i=\text{點}i\text{的入流}-\text{點}i\text{的出流}\),然后建附加網絡:

  1. 新建源點\(ss\)和匯點\(tt\)
  2. 對於原圖中的每條邊\(e_i=(u,v)\),連邊\((u,v,r_i-l_i)\),也就是說附加網絡包括原網絡的邊。
  3. 新建邊來滿足流量守恆
    • \(d_i=0\)則該點流量平衡,不用處理
    • \(d_i>0\)則入流>出流,那么附加網絡中\(i\)的出邊需要增加流量,我們連邊\((ss,i,d_i)\),這樣求最大流的時候出邊的流量會增加\(d_i\),疊加后滿足流量守恆
    • \(d_i<0\)則入流<出流,那么附加網絡中\(i\)的入邊需要增加流量,同理連邊\((i,tt,-d_i)\),這樣求最大流的時候入邊的流量會增加\(-d_i\),疊加后滿足流量守恆

那么當且僅當步驟3中新建邊滿流時有解,總可行流為\(\mathrm{maxflow} (ss,tt)+\sum l_i\)。每條邊在原圖中流量=容量下界+附加流中它的流量

有源匯有上下界可行流

定義: 在有源匯網絡上求一個流量方案,使得每條邊的流量必須在\([l_i,r_i]\)之間,且除源匯外每個點流量守恆。

設原網絡的源和匯分別為\(s,t\)我們在原網絡上加一條邊\((t,s,+\infty)\),相當於把到匯點的所有流量都流回源點,這樣每個點流量都守恆。
然后套無源匯的方法即可。注意總流量=t到s的無窮邊在原圖中的流量

有源匯有上下界最大流和最小流

定義: 在有源匯網絡上求一個流量方案,使得每條邊的流量必須在\([l_i,r_i]\)之間,且除源匯外每個點流量守恆。在這個條件下使得總流量最大/最小。

先按上面的方法求出一個有源匯有上下界可行流.然后在附加網絡上再跑一次\(s\)\(t\)的最大流(注意不是ss,tt!)。最大流=可行流+第二次跑的s到t最大流。

再跑一次最大流是因為附加網絡上屬於原圖的邊還有流量沒被“榨干”。容易發現只要附加網絡上不屬於原圖的邊滿流,屬於原圖的邊怎么跑流量都是守恆的。因為第一次跑最大流已經保證所有點守恆,第二次跑最大流不會經過不屬於原圖的邊,因此等價於對原圖跑一次普通的最大流,除源匯外流量守恆。兩次合起來總流量一定守恆,這就保證了正確性。

同理求最小流就跑一次\(t\)\(s\)的最大流。最小流=可行流-第二次跑的t到s最大流。這是因為Dinic過程中反向邊的流量增加等價於正向邊的的流量減少。

有源匯有上下界最小費用流

定義: 在有源匯網絡上求一個流量方案,使得每條邊的流量必須在\([l_i,r_i]\)之間,且除源匯外每個點流量守恆。每條邊單位流量的費用為\(c_i\).在這個條件下使得總費用最小,費用定義同一般費用流。(不要求總流量最大)

這是有上下界費用流常被誤解的一點,即最小費用流求的是費用最小的可行流,而不是最大流。

因此按有源匯可行流的方法建圖,把原圖中的邊帶上費用。總費用=\(\text{mincost}(ss,tt)+\sum l_ic_i\)

ll solve(int s,int t){
    ll ans=0;
    int ss=cntv+1,tt=cntv+2;
    adde(t,s,0,INF,0);
    for(int i=1;i<=cnte;i++){
        dflow[E[i].from]-=E[i].lflow;
        dflow[E[i].to]+=E[i].lflow;
        ans+=E[i].lflow*E[i].cost;
        MCMF::add_edge(E[i].from,E[i].to,E[i].rflow-E[i].lflow,E[i].cost); 
    }
    for(int i=0;i<=cntv;i++){
        if(dflow[i]>0) MCMF::add_edge(ss,i,dflow[i],0);
        else if(dflow[i]<0) MCMF::add_edge(i,tt,-dflow[i],0);
    }
    return ans+MCMF::mcmf(ss,tt);
}

例題:

餐巾計划問題

[AHOI2014]支線劇情

一些連邊技巧總結

多源匯點: 建立超級源和超級匯

節點容量::拆點,兩個拆點之間的邊容量為節點的容量。注意一些費用流問題里不能把兩個點直接相連,因為費用流的前提最大流可能會導致建圖與實際意義不符,即這條邊被強行跑滿。如果一定要這樣做,可以加上下界。

費用與流量平方成正比:拆邊,設系數為\(a\),把拆邊的費用設為$a,3a,5a\dots $,容量設成1,又因為費用流會按費用從小到大增廣,那么最終費用會是 \(a,4a,9a\dots\)


網絡流的技巧還有很多,尤其是一些題目需要流,割等概念的意義的深刻理解,水平所限,這種比較玄學的部分只能留給讀者了。
QQ圖片20210604124100.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM