anoosykh95

Untitled

Jul 22nd, 2016
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAXE 100000
  4. #define MAXN 100000
  5. struct EDGES{
  6.     int u,v,cap,flow,nextedge;
  7. };
  8. class MAXIMUM_FLOW{
  9.     public :
  10.     EDGES edge[MAXE];
  11.     int n , m , level[MAXN],Prev[MAXN],last[MAXN];
  12.     queue<int>Q;
  13.     void init(int N){
  14.         n = N;
  15.         m = -1;
  16.         for(int j=0;j<=n;j++) last[j] = -1;
  17.     }
  18.     void addedge(int a,int b,int c){
  19.         edge[++m].u=a , edge[m].v=b , edge[m].cap=c , edge[m].flow=0 , edge[m].nextedge=last[a] , last[a]=m;
  20.         edge[++m].u=b , edge[m].v=a , edge[m].cap=0 , edge[m].flow=0 , edge[m].nextedge=last[b] , last[b]=m;
  21.     }
  22.     bool level_graph(int src,int snk){
  23.         for(int j=0;j<=n;j++) level[j]=-1;
  24.         int node,nxt;
  25.         level[src]=1;
  26.         Q.push(src);
  27.         while(!Q.empty()){
  28.             node=Q.front(); Q.pop();
  29.             for(int j=last[node];j!=-1;j=edge[j].nextedge){
  30.                 nxt=edge[j].v;
  31.                 if(level[nxt]==-1 && edge[j].flow<edge[j].cap){
  32.                     level[nxt]=level[node]+1;
  33.                     Q.push(nxt);
  34.                 }
  35.             }
  36.         }
  37.         return (level[snk]!=-1);
  38.     }
  39.     int dfs(int node,int snk,int flow){
  40.         int nxt,curflow;
  41.         if(node==snk) return flow;
  42.         for(int &j=Prev[node];j!=-1;j=edge[j].nextedge){
  43.             nxt=edge[j].v;
  44.             if(level[nxt]==level[node]+1 && edge[j].flow<edge[j].cap){
  45.                 curflow=dfs(nxt,snk,min(flow,edge[j].cap-edge[j].flow));
  46.                 if(curflow==0) continue;
  47.                 edge[j].flow+=curflow;
  48.                 edge[j^1].flow-=curflow;
  49.                 return curflow;
  50.             }
  51.         }
  52.         return 0;
  53.     }
  54.     int MAX_FLOW(int src,int snk){
  55.         int flow,ans=0;
  56.         while(level_graph(src,snk)){
  57.             for(int j=0;j<=n;j++)
  58.                 Prev[j]=last[j];
  59.             while(flow=dfs(src,snk,(1<<31)-1)) ans+=flow;
  60.         }
  61.         return ans;
  62.     }
  63. };
Add Comment
Please, Sign In to add comment