Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N=1000;
- const int M=500;
- const int inf=1e9;
- struct Edge
- {
- int u, v, cap, flow, next;
- } grana[M];
- int n, m, head[N], dist[N];
- int E, src, snk;
- void add_edge (int u, int v, int c1, int c2)
- {
- grana[E++]=(Edge){u, v, c1, 0, head[u]};
- head[u]=E-1;
- grana[E++]=(Edge){v, u, c2, 0, head[v]};
- head[v]=E-1;
- }
- bool bfs ()
- {
- fill(dist, dist+N, -1);
- queue<int> q;
- dist[src]=0;
- for (q.push(src);!q.empty();q.pop())
- {
- int v=q.front();
- for (int e=head[v];e!=-1;e=grana[e].next)
- {
- int xt=grana[e].v;
- if (grana[e].cap>grana[e].flow && dist[xt]==-1)
- {
- dist[xt]=dist[v]+1;
- q.push(xt);
- }
- }
- }
- return (dist[snk]!=-1);
- }
- int dfs (int v, int minCap)
- {
- if (minCap==0) return 0;
- if (v==snk) return minCap;
- for (int e=head[v];e!=-1;e=grana[e].next)
- {
- int xt=grana[e].v;
- if (dist[xt]!=dist[v]+1) continue;
- int augment=dfs(xt, min(minCap, grana[e].cap-grana[e].flow));
- if (augment)
- {
- grana[e].flow+=augment;
- grana[e^1].flow-=augment;
- return augment;
- }
- }
- return 0;
- }
- int Dinic()
- {
- int flow=0;
- src=1, snk=n;
- while (true)
- {
- if (!bfs()) break;
- while (true)
- {
- int curFlow=dfs(src, inf);
- if (curFlow==0) break;
- flow+=curFlow;
- }
- }
- return flow;
- }
- int main()
- {
- scanf ("%d%d", &n, &m);
- fill(head, head+N, -1);
- for (int i=0;i<m;i++)
- {
- int a, b, c;
- scanf ("%d%d%d", &a, &b, &c);
- add_edge(a, b, c, 0);
- }
- printf ("%d", Dinic());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment