模板 EK求最大流 dinic求最大流

2021-10-17 05:28:13 字數 1909 閱讀 8003

acm模板

yxc老師的部分總結

基本概念

1.1 流網路,不考慮反向邊

1.2 可行流,不考慮反向邊

1.2.1 兩個條件:容量限制、流量守恆

1.2.2 可行流的流量指從源點流出的流量 - 流入源點的流量

1.2.3 最大流是指最大可行流

1.3 殘留網路,考慮反向邊,殘留網路的可行流f』 + 原圖的可行流f = 原題的另乙個可行流

1.4 增廣路徑

1.5 割

1.5.1 割的定義

1.5.2 割的容量,不考慮反向邊,「最小割」是指容量最小的割。

1.5.3 割的流量,考慮反向邊,f(s, t) <= c(s, t)

1.5.4 對於任意可行流f,任意割[s, t],|f| = f(s, t)

1.5.5 對於任意可行流f,任意割[s, t],|f| <= c(s, t)

1.5.6 最大流最小割定理

(1) 流f是最大流

(2) 流f的殘留網路中不存在增廣路

(3) 存在某個割[s, t],|f| = c(s, t)

1.6. 演算法

1.6.1 ek o(nm^2)

1.6.2 dinic o(n^2m)

1.7 應用

1.7.1 二分圖

(1) 二分圖匹配

(2) 二分圖多重匹配

1.7.2 上下界網路流

(1) 無源匯上下界可行流

(2) 有源匯上下界最大流

(3) 有源匯上下界最小流

1.7.3 多源匯最大流

鏈式前向星初始化-1版本 0正邊 1反邊

s源點 t匯點

d流量pre前向邊

存圖存的是殘留網路

時間複雜度:o(n

m2

)o(nm^2)

o(nm2)

constexpr

int n=

1010

,m=20010

;int h[n]

,e[m]

,ne[m]

,f[m]

,idx;

int n,m;

int s,t,flow[n]

,pre[n]

;bool st[n]

;void

add(

int a,

int b,

int c)

bool

bfs()}

}return0;

}intek(

)}return ans;

}

模擬佇列

時間複雜度:o(n

2m

)o(n^2m)

o(n2m)

int h[n]

,e[m]

,ne[m]

,f[m]

,idx;

int s,t,d[n]

,q[n]

,cur[n]

;void

add(

int a,

int b,

int c)

bool

bfs()}

}return0;

}int

dfs(

int u=s,

int flow=

0x3f3f3f3f)}

return flow-rmn;

}int

dinic()

Dinic演算法求最大流

include using namespace std const int oo 1e9 無窮大 const int maxm 111111 邊的最大數量,為原圖的兩倍 const int maxn 999 點的最大數量 int node,src,dest,edge node節點數,src源點,de...

Dinic求最大流 最小割

o v 2 e 建圖時建一條流量為0的反向邊,正向邊每減去流量f,反向邊增加流量f.對於無向圖當做兩條邊。cap 每條邊最大流量 建圖後 呼叫dinic 用bfs 為每個節點進行層次編號,在每種層次編號下,用dinic 即dfs找到所有增廣路,加到最大流結果。theme 給定m條邊,n個點,1為源點...

最大流EK和Dinic演算法

最樸素的求最大流的演算法。做法 不停的尋找增廣路,直到找不到為止 如下 frosero include include include include define inf 0x3f3f3f3f using namespace std int n,m int cap 202 202 flow 202...