最大流:給定有向圖中每條邊的最大流量(容量),求從源點到匯點的最大流量。
容量網路: 括號左邊代表容量,右邊代表流量。
殘留網路:流網路中剩餘可增加的流量
增廣路:滿足容量條件的一條流量不為零的路徑。
增廣路定理:設容量網路g(v,e)的乙個可行流為f,f為最大流的充要條件是在容量網路中不存在增廣路。
ford-fulkson方法:搜尋殘留網路找增廣路,直至找不到增廣路(找到最大流)。
edmonds-karp演算法:利用bfs搜尋增廣路的演算法,複雜度o(ve2)
queue
que;
bool visited[maxn];
int p[maxn];
int map[maxn][maxn];
bool bfs (int s, int t)}}
return
false;
}int edmond_skarp (int s,int t)
ret += f;
u = t;
while (p[u] != -1)
}return ret;
}
層次網路:用bfs對殘留網路進行分層後,刪去比匯點層次更高的頂點和與匯點同層的頂點,並刪去這些頂點關聯的弧,再刪去從某層頂點指向同層頂點和低層頂點的弧,所剩弧的容量和殘留網路中的相同,得到的網路是層次網路。
dinic演算法:每次用bfs建立層次網路,再用dfs進行增廣,當bfs後匯點不在層次網路中,演算法結束。
演算法複雜度o(v2e)
struct edge;
vector
g[maxn];
int level[maxn];
int iter[maxn];
void bfs(int s)}}
}int dfs(int v,int t,int f)}}
return0;}
int dinic(int s,int t)
}
在網路流問題中,最重要的是模型的建立和轉換,也就是建圖的過程。網路流問題一般具有明顯的變數的約束條件。
hdu3416
題意:問乙個有向圖中最短路的路徑數量(在不同的路徑中沒有重複的邊)。
思路:先用最短路演算法求出最短路,找出最短路的路徑。建乙個新圖,源點和匯點與原圖的起點和終點相同。對於路徑中的邊,在新圖中連一條容量為1的u到v的邊,求出新圖的最大流,即為路徑的數量。
尋找最短路路徑的問題:若dis[v]= dis[u] + cost[u][v] ,則是最短路中的邊。
hdu3572
題意:
有n個任務(n<=500),每個任務需要被處理pi天才能完成,且只能在第si到第ei天(sihdu2883
題意:
n個人去吃烤肉(n<=200),每個人在si時刻來,ei時刻離開,點ni份烤肉,其中每份烤肉需要烤ti個單位時間。(1 <= si < ei <= 1000000),烤肉店每個單位時間能同時烤m份烤肉,每塊烤肉可以被分成任意大小烤,問烤肉店能否滿足人們的需求。
思路:首先,要注意到,可以把ni塊烤肉用ti的時間烤看作把ni* ti塊烤肉用1個單位的時間烤。這道題需要用到離散化思想。和上題一樣,把時間也看成點,不同的是這題要把時間段看成點。具體做法是把所有的si和ei從小到大排序,依次給每個時間間隔標號。源點向每個人連容量為ni* ti的邊,如果某人的si和ei在時間內,這個人向區間連容量為inf的邊,此外,每個區間向匯點連容量為m*(ti-ti-1)的邊。
拆點:把點權轉換為邊權。
hdu2732
題意:有乙個n*m的圖,圖上有一些柱子,每根柱子有一定的耐久度,在其中一些柱子上有蜥蜴(每根柱子最多有乙隻), 蜥蜴的最大跳躍長度是d,當蜥蜴完成一次跳躍後,原先柱子的耐久度-1。問最多有多少蜥蜴能跳出這個圖(跳出邊緣)。
思路:需要選擇每只蜥蜴的跳躍路徑使得能讓最多的蜥蜴跳出去。容易想到把乙隻蜥蜴的路徑看作網路流中的一條流。建立乙個源點s和匯點t,源點向所有有蜥蜴的點連一條容量為1的邊。網路流的流量被點權限制,可以把每個點拆分為兩個點u,v,邊的權為點的權,把連向原點的邊連給u點,v連線原點連出的點。如果能從當前點跳出,則在v和t 之間連一條容量為inf的邊。
hdu4309
題意:有n個城市的人要進行避難,每個城市擁有的人數是ai,圖上有三種邊,一種是隧道,每個隧道可以庇護bi個人,第二種是普通的公路,可以通過任意數量的人,第三種是破橋(最多12座),只能通過1個人,但是破橋被修復之後也可以通過任意數量的人,修復的費用是ci,問能庇護的最大人數,同時求出修橋的最小費用。
思路:先不考慮修復橋的問題,容易建立乙個網路流的模型。源點連線每個城市,容量為城市擁有的人數。公路是容量為inf的邊,橋是容量為1的邊。對於隧道,可以新建乙個點,隧道兩端的點到這個點的容量是inf,這個點到匯點的邊的容量是隧道的容納量。
由於橋的數量很小,所以可以狀壓列舉修橋的情況,求出每次的容納人數和修橋費用。修理一座橋即在兩個點之間再連一條容量為inf的邊。
網路流與二分匹配:
二分圖中的所有點可分為u集合和v集合,它們的交集為空集,二分圖中的邊一定連線了u集合和v集合中的兩點。
將原圖中所有的無向邊變為有向邊,容量為1。源點連線u,v連線匯點,容量都為1,最大流即為最大匹配。
題意:有個人在r*c的圖上尋寶,圖上有有一些無法到達的障礙和金子,他必須他每次必須從乙個檢查點(用大寫字母和小寫字母表示)經過最短路徑到達下乙個檢查點(比如從a到b,b到c),途中最多撿起一塊金子。問他最多能夠撿起多少塊金子。
思路:這是乙個金子和檢查點的最大匹配問題。途中經過的每乙個檢查點和路徑中能夠撿到的金子連線。然後用前面的方法求出最大匹配。
hdu3081
思路:可以利用類似二分匹配的想法。二分進行的輪數r,每個女孩與她能配對的男孩子之間連一條容量為1的邊(因為只能匹配一次)。源點向每個女孩連一條容量為r的邊,男孩向匯點連一條容量為r的邊,如果此時的最大流為r,則能夠完成r次匹配。
割:去掉後使得圖不連通的邊的集合
割的容量:割中所有前向弧的容量的和
最小割:容量最小的割
最大流最小割定理:對容量網路g(v,e),其最大流的容量等於最小割的容量
hdu5889 (2016icpc青島網路賽)
題意:給定乙個無向圖,圖上每條邊的長度是1,求刪去權值和最小的邊,使得圖上的最短路都被切斷。
思路:最大流最小割定理
hdu3046
題意:圖上有n*m個方塊(0思路:源點向羊連容量為inf的邊,狼向匯點連容量為inf的邊,每個格仔向與它相鄰的格仔連一條容量為1的邊。
網路流 最大流最小割
網路流黃頁 最大流是增廣思想的傑作,針對增光特點,採用dinic阻塞流分層 除錯編譯通過 這個沒什麼,肯定不會考裸,模板的構建是最重要的 並且還有最小割最大流定理 相等 利用拆點實現割集劃分即選與不選,放a或b1 include2 include3 include4 include5 include...
網路流最大流最小割演算法
最大流演算法 不得不說網路流演算法是很讓人無語的演算法,要想高效率竟然要非遞迴實現深搜,很無奈,到現在還是在低效率中掙扎!最大流演算法的證明就不說了,無非就是最大流最小割定理的推導,定理描述如下 對於任意給定的網路d v,a,c 從出發點vs到收點vt的最大流的流量必等於分割的最小截集的容量!至於截...
網路流 最小割最大流定理
有乙個與最大流關係密切的問題 最小割。就是把所有的頂點分成兩個集合s和t v s,其中源點s在集合s中,匯點t在集合t中。如果把 起點在s中,終點在t中 的邊都刪除,就無法從s到達t了。我們把這樣的集合劃分 s,t 成為s t割,它的容量定義為c s,t c u,v 其中u s,t t,即起點在s中...