Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int n, m;
- typedef long long LL;
- namespace maxFlow{
- const int MAXN = 5000;
- int src, snk, n, nxt[MAXN+5], inf = 1.5e9, dist[MAXN+5];
- struct edge{
- int v, cap, opposite, flow;
- };
- vector<edge>E[MAXN+5];
- void init(int _src, int _snk, int _n)
- {
- src = _src, snk = _snk, n = _n;
- }
- void add(int u, int v, int cap)
- {
- E[u].push_back({v,cap,E[v].size(),0});
- E[v].push_back({u,cap,E[u].size()-1,0});
- }
- bool bfs()
- {
- memset(dist,-1,sizeof(dist));
- queue<int>q;
- dist[src] = 0;
- q.push(src);
- while(!q.empty())
- {
- int u = q.front();
- q.pop();
- for(int i = 0; i<E[u].size(); i++)
- {
- if(E[u][i].cap > E[u][i].flow)
- {
- int v = E[u][i].v;
- if(dist[v] == -1)
- {
- dist[v] = dist[u] +1;
- q.push(v);
- }
- }
- }
- }
- return dist[snk] != -1;
- }
- int dfs(int u, int sentFlow)
- {
- if(u == snk)
- return sentFlow;
- for(; nxt[u]<E[u].size(); nxt[u]++)
- {
- int v = E[u][nxt[u]].v;
- int c = E[u][nxt[u]].cap;
- int f = E[u][nxt[u]].flow;
- int opposite = E[u][nxt[u]].opposite;
- if(dist[v] == dist[u]+1 && c > f)
- {
- int tmp = dfs(v,min(sentFlow,c-f));
- if(tmp)
- {
- E[u][nxt[u]].flow += tmp;
- E[v][opposite].flow -= tmp;
- return tmp;
- }
- }
- }
- return 0;
- }
- LL dinitz()
- {
- LL totalFlow = 0;
- while(bfs())
- {
- memset(nxt,0,sizeof(nxt));
- int sentFlow;
- while(sentFlow = dfs(src,inf))
- totalFlow += sentFlow;
- }
- return totalFlow;
- }
- }
- int main()
- {
- // freopen("in.txt", "r", stdin);
- int i, j, u, v, w;
- scanf("%d %d",&n,&m);
- maxFlow::init(1,n,n);
- for(int i = 1; i<=m; i++)
- {
- scanf("%d %d %d",&u,&v,&w);
- if(u == v)
- continue;
- maxFlow::add(u,v,w);
- }
- printf("%lld\n",maxFlow::dinitz());
- }
Advertisement
Add Comment
Please, Sign In to add comment