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(); }
|