最大流:html
(1)最大流定義:
算法
在容量網絡中,知足弧流量限制條件,且知足平衡條件而且具備最大流量的可行流,稱爲網絡最大流,簡稱最大流。數組
(2)最大流判斷兩點之間是否有流量:網絡
經過判斷它的逆向邊是否有流來實現。spa
費用流:.net
(1)費用流定義:xml
費用流,也叫做最小費用最大流,是指在普通的網絡流圖中,每條邊的流量都有一個單價,求出一組可行解,使得在知足它是最大流的狀況下,總的費用最小。 htm
2.初始化spfa時dis數組全從INF改成-INF,鬆弛的條件從 dis[i]>dis[j]+cost[i,j]改成dis[i]<dis[j]+cost[i,j] 。blog
最小割:get
(1)最小割定義:
假設在原圖中,刪掉某些邊,可以使得從s出發到不了t,則這些邊的集合被稱做圖的割。 定義最小割,爲容量和最小的割。
(2)最大流最小割定理:
最大流最小割定理是網絡流理論的重要定理。是指在一個網絡流中,可以從源點到達匯點的最大流量等於若是從網絡中移除就可以致使網絡流中斷的邊的集合的最小容量和。即在任何網絡中,最大流的值等於最小割的容量。
(3)輸出最小割:如果要輸出最小割,在最後dinic算法結束的殘留網絡中,從源點尋找全部與源點仍然鏈接的點,並打上標記。這樣若某一條邊的兩個端點,一個帶標記,一個不帶標記,則這條邊能夠做爲最小割的邊刪去。我我的理解這樣刪去的邊應該是第一階段滿流的那幾條邊。這樣刪除的邊最後確定是知足最小割的,可是邊數可能不是最少的。
(4)求最小割且割數最小:
跑兩遍dinic,第一遍跑最大流,求得最小割是多少,第二遍把第一遍中滿流的邊權設爲1,其餘設爲inf,再跑一邊最小割,求得最少須要割去幾條邊。
最大權閉合子圖:
(1)定義:
一個子圖(點集), 若是它的全部的出邊都在這個子圖當中,那麼它就是閉合子圖。 點權和最大的閉合子圖就是最大閉合子圖。
(2)求最大權閉合子圖:
設s爲源點,t爲匯點。使s連向全部的正權點,邊權爲點權。使全部負權點連向t,邊權爲點權的絕對值。若要選x必須先選y,連一條由x到y的邊,邊權是INF。最大點權和=正權點和-最小割。
(3)輸出最大權閉合子圖:
最大權閉合子圖的問題能夠轉化爲求解最小割的問題,咱們所求的閉合子圖是最小割產生的兩個子圖中,與源點鏈接的那個子圖。最大權閉合子圖的題目很特殊,它的最小割的邊都是與源點或者匯點直接相連,若是答案的方法是惟一的話,那麼最小割應該也是惟一的(我的猜想),這樣的話在dinic以後從源點開始遍歷與源點仍然鏈接的點,這些點都是最大權閉合子圖中的點。
DAG最小路徑覆蓋:
(1)定義:
在一個有向無環圖中,找出最少的路徑,使得這些路徑通過了全部的點,且這些路徑之間不會通過相同的點。
(2)求最小路徑覆蓋:
把原圖的每一個點V拆成Vx和Vy兩個點,若是有一條有向邊A->B,那麼就加邊Ax−>By。這樣就獲得了一個二分圖。那麼最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。
證實:
一開始每一個點都是獨立的爲一條路徑,總共有n條不相交路徑。咱們每次在二分圖裏找一條匹配邊就至關於把兩條路徑合成了一條路徑,也就至關於路徑數減小了1。因此找到了幾條匹配邊,路徑數就減小了多少。因此有最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。由於路徑之間不能有公共點,因此加的邊之間也不能有公共點,這就是匹配的定義。
(3)輸出每條路徑上的點:
考慮咱們是如何求最小路徑覆蓋的,咱們一開始認爲路徑集合就是點集,而後找到一個匹配邊,把這個邊的兩個點所在的集合合併成一個集合(其實就是把兩條路徑合併成一條路徑)。若是最大匹配是用最大流寫的,則最後判斷某兩個點是否在一條路徑上,就直接判斷它們的反向邊是否有流量(注意這裏的兩個點並非任意的兩個點,而是一條路徑上相鄰的兩個點)。這樣按照某種順序就能夠按順序輸出每條邊上的點。
(1)定義:
在二分圖最大匹配中,每一個點(不論是X點仍是Y點)最多隻能和一條匹配邊相關聯,然而,咱們常常遇到這種問題,即二分圖匹配中一個點能夠和多條匹配邊相關聯,但有上限,或者說,Li表示點i最多能夠和多少條匹配邊相關聯。
二分圖多重匹配分爲二分圖多重最大匹配與二分圖多重最優匹配兩種,分別能夠用最大流與最大費用最大流解決。
(2)二分圖多重最大匹配:
在原圖上創建源點S和匯點T,S向每一個X點連一條容量爲該X點L值的邊,每一個Y點向T連一條容量爲該Y點L值的邊,原來二分圖中各邊在新的網絡中仍存在,容量爲1(若該邊可使用屢次則容量大於1),求該網絡的最大流,就是該二分圖多重最大匹配的值。
(3)二分圖多重最優匹配:
在原圖上創建源點S和匯點T,S向每一個X點連一條容量爲該X點L值、費用爲0的邊,每一個Y點向T連一條容量爲該Y點L值、費用爲0的邊,原來二分圖中各邊在新的網絡中仍存在,容量爲1(若該邊可使用屢次則容量大於1),費用爲該邊的權值。求該網絡的最大費用最大流,就是該二分圖多重最優匹配的值。
(1)定義:
最小點覆蓋要求選最少的點讓二分圖中的每條邊都至少和其中一個點關聯。能夠證實:最少的點數(即覆蓋數)=最大匹配數。
(2)求出最小點覆蓋集:
將二分圖點集分爲左右兩個點集,標記右邊未匹配邊的頂點,並從右邊未匹配邊的頂點出發,按照邊:未匹配->匹配->未匹配...,的原則標記途中通過的頂點,則最後一條通過的邊一定爲匹配邊。重複上述過程,直到右邊再也不含有未匹配邊的點。記獲得的左邊已標記的點和右邊未標記的點爲S, S即爲所求的最小頂點集。
證實參考:
http://www.matrix67.com/blog/archives/116
http://www.javashuo.com/article/p-hyxriozy-hv.html
(3)二分圖最大點獨立集
最大點獨立集=總點數-最小點覆蓋集。
證實參考:
https://blog.csdn.net/Techmonster/article/details/50011363
(4)二分圖最小邊覆蓋
最小邊覆蓋 = 最大點獨立集 = 總點數 - 二分圖最大匹配。
二分圖最小點權覆蓋:
(1)定義:
對於有點權的二分圖,選出權值和最小的點的集合覆蓋全部的邊。
(2)求最小點權覆蓋:
創建源點S,匯點T,源匯點分別與原二分圖的各部分連邊,容量爲點權,原來二分圖中的邊保持不變,並將其容量改成INF。則此圖的最小割就是最小點權覆蓋。
且最小割中的邊對應的點,就是最小點權覆蓋集中的點。
(3)二分圖最大點權獨立集:
二分圖點權最大獨立集=二分圖點權和-二分圖最小點權覆蓋集。