Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define maxn 5*1024
  3. #define maxm 30*1024*2
  4. #define MAX (long long)(1e9+5)
  5. using namespace std;
  6. struct edge
  7. {
  8.     long long a,b,cap,x;
  9.     edge() {}
  10.     edge(long long _a,long long _b,long long _cap,long long _x)
  11.     {
  12.         a=_a;
  13.         b=_b;
  14.         cap=_cap;
  15.         x=_x;
  16.     }
  17. };
  18. edge E[maxm];
  19. long long lvl[maxn],head[maxn],ptr[maxn],path_len,path[maxn],s,t,n,m,cnt;
  20. long long dfs(long long v)
  21. {
  22.     if(v==t)return MAX;
  23.     for(long long e=ptr[v]; e!=-1; e=ptr[v]=E[e].x)
  24.     {
  25.         if(lvl[E[e].b]+1==lvl[v]&&E[e].cap>0)
  26.         {
  27.             path[path_len++]=e;
  28.             long long fl=dfs(E[e].b);
  29.             if(fl!=0)return min(fl,E[e].cap);
  30.             path_len--;
  31.         }
  32.     }
  33.     return 0;
  34. }
  35. bool bfs(long long s,long long t)
  36. {
  37.     memset(lvl,-1,sizeof(lvl));
  38.     lvl[t]=0;
  39.     queue<long long>q;
  40.     q.push(t);
  41.     while(!q.empty())
  42.     {
  43.         long long u=q.front();
  44.         q.pop();
  45.         for(long long i=head[u]; i!=-1; i=E[i].x)
  46.         {
  47.             long long nb=E[i].b;
  48.             if(lvl[nb]==-1&&E[i^1].cap>0)
  49.             {
  50.                 q.push(nb);
  51.                 lvl[nb]=lvl[u]+1;
  52.             }
  53.         }
  54.     }
  55.     return lvl[s]!=-1;
  56. }
  57. long long dinitz(long long s,long long t)
  58. {
  59.     long long maxflow=0,flow;
  60.     while(bfs(s,t))
  61.     {
  62.         for(long long i=1; i<=n; i++)ptr[i]=head[i];
  63.         while((flow=dfs(s)))
  64.         {
  65.             maxflow+=flow;
  66.             for(long long i=0; i<path_len; i++)
  67.             {
  68.                 E[path[i]].cap-=flow;
  69.                 E[path[i]^1].cap+=flow;
  70.             }
  71.             path_len=0;
  72.         }
  73.     }
  74.     return maxflow;
  75. }
  76. int main()
  77. {
  78.     long long u,v,c;
  79.     cin>>n>>m;
  80.     s=1;
  81.     t=n;
  82.     memset(head,-1,sizeof(head));
  83.     for(long long i=0; i<m; i++)
  84.     {
  85.         cin>>u>>v>>c;
  86.         E[cnt]=edge(u,v,c,head[u]);
  87.         head[u]=cnt++;
  88.         E[cnt]=edge(v,u,c,head[v]);
  89.         head[v]=cnt++;
  90.     }
  91.  
  92.     cout<<dinitz(s,t)<<endl;
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement