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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f using namespace std; const int maxn = 1e5 + 5; const int maxm = 1e6 + 5; struct edge{ int to, next, w; }e[maxm]; int head[maxn], num; int n; void add(int u, int v, int w){ e[num] = (edge){v, head[u], w}; head[u] = num++; e[num] = (edge){u, head[v], 0}; head[v] = num++; } int st, ed; int d[maxn]; bool bfs(){ memset(d, -1, sizeof d); d[st] = 1; queue<int> q; q.push(st); while(!q.empty()){ int u = q.front(); q.pop(); for(int i=head[u];~i;i=e[i].next){ int v = e[i].to; if(d[v] > 0 || e[i].w == 0 ) continue; d[v] = d[u] + 1; if(v == ed) return 1; q.push(v); } } return 0; } int cur[maxn]; int dfs(int u, int exp){ if(u == ed || !exp) return exp; int flow = 0, f; for(int& i=cur[u];~i;i=e[i].next){ int v = e[i].to; if(d[v] == d[u] + 1 && (f=dfs(v, min(exp, e[i].w)))){ e[i].w -= f; e[i^1].w += f; flow += f; exp -= f; if(!exp) break; } } return flow; }
int dinic(){ int ans = 0; while(bfs()){ memcpy(cur, head, sizeof head); ans += dfs(st, inf); } return ans; } int main(){ num = 0; memset(head, -1, sizeof head); printf("%d\n", dinic()); return 0; }
|