Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define maxn 5*1024
- #define maxm 30*1024*2
- #define MAX (long long)(1e9+5)
- using namespace std;
- struct edge
- {
- long long a,b,cap,x;
- edge() {}
- edge(long long _a,long long _b,long long _cap,long long _x)
- {
- a=_a;
- b=_b;
- cap=_cap;
- x=_x;
- }
- };
- edge E[maxm];
- long long lvl[maxn],head[maxn],ptr[maxn],path_len,path[maxn],s,t,n,m,cnt;
- long long dfs(long long v)
- {
- if(v==t)return MAX;
- for(long long e=ptr[v]; e!=-1; e=ptr[v]=E[e].x)
- {
- if(lvl[E[e].b]+1==lvl[v]&&E[e].cap>0)
- {
- path[path_len++]=e;
- long long fl=dfs(E[e].b);
- if(fl!=0)return min(fl,E[e].cap);
- path_len--;
- }
- }
- return 0;
- }
- bool bfs(long long s,long long t)
- {
- memset(lvl,-1,sizeof(lvl));
- lvl[t]=0;
- queue<long long>q;
- q.push(t);
- while(!q.empty())
- {
- long long u=q.front();
- q.pop();
- for(long long i=head[u]; i!=-1; i=E[i].x)
- {
- long long nb=E[i].b;
- if(lvl[nb]==-1&&E[i^1].cap>0)
- {
- q.push(nb);
- lvl[nb]=lvl[u]+1;
- }
- }
- }
- return lvl[s]!=-1;
- }
- long long dinitz(long long s,long long t)
- {
- long long maxflow=0,flow;
- while(bfs(s,t))
- {
- for(long long i=1; i<=n; i++)ptr[i]=head[i];
- while((flow=dfs(s)))
- {
- maxflow+=flow;
- for(long long i=0; i<path_len; i++)
- {
- E[path[i]].cap-=flow;
- E[path[i]^1].cap+=flow;
- }
- path_len=0;
- }
- }
- return maxflow;
- }
- int main()
- {
- long long u,v,c;
- cin>>n>>m;
- s=1;
- t=n;
- memset(head,-1,sizeof(head));
- for(long long i=0; i<m; i++)
- {
- cin>>u>>v>>c;
- E[cnt]=edge(u,v,c,head[u]);
- head[u]=cnt++;
- E[cnt]=edge(v,u,c,head[v]);
- head[v]=cnt++;
- }
- cout<<dinitz(s,t)<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement