Dinic Maxflow Algorithm

Zhiyuan Xu Lv1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
namespace Dinic{
int n,m,s,t,a,b,head[MAXN],c,tot=1,dep[MAXN],flow;
struct Edge{
int u,v,nxt,val;
}edge[MAXM<<1];

inline void add(int f, int t, int d){
edge[++tot].u = f;
edge[tot].v = t;
edge[tot].nxt = head[f];
edge[tot].val = d;
head[f] = tot;
}
inline void addedge(int f,int t, int d){
add(f,t,d);add(t,f,0);
}
inline bool Dinic(){
queue<int> q;
q.push(s);
memset(dep,0,sizeof(dep));
dep[s] = 1;
while(!q.empty()){
int qf = q.front();q.pop();
for (int i=head[qf];i;i=edge[i].nxt){
int v= edge[i].v;
if (!dep[v] && edge[i].val){
dep[v] = dep[qf]+1;
q.push(v);
}
}
}
return dep[t];
}
inline int dfs(int u, int lim){
if(!lim || u==t) return lim;
int tflow = 0;
for (int i=head[u];i;i=edge[i].nxt){
int v = edge[i].v;
if (dep[v] ==dep[u]+1 && edge[i].val){
int now = dfs(v,min(lim,edge[i].val));
edge[i].val-=now;
edge[i^1].val+=now;
tflow+=now;
lim-=now;
}
}
if (!tflow) dep[u] = 0;
return tflow;
}
inline void solve();
}
  • Title: Dinic Maxflow Algorithm
  • Author: Zhiyuan Xu
  • Created at : 2024-07-06 00:06:41
  • Updated at : 2024-07-06 00:27:50
  • Link: https://redefine.ohevan.com/Template/DinicMF/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
Dinic Maxflow Algorithm