Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. const int maxn = 10110;
  2. const int maxm = 50000;
  3. const int inf = 0x3f3f3f3f;
  4. int n,m ,tol;
  5. int head[maxn];
  6. struct Edge
  7. {
  8.     int to,cap,flow,nex;//加cap通用性更好
  9.     Edge(int to,int cap,int flow,int nex): to(to),cap(cap),flow(flow),nex(nex) {}
  10.     Edge() {}
  11. } edge[maxm];
  12. int dis[maxn];
  13. void init()
  14. {
  15. memset(head,-1,sizeof head);
  16.     tol =0;
  17. }
  18.  
  19. void addedge(int u,int v,int cap,int rw=0)//单向图3参数,双向图4参数
  20. {
  21.     edge[tol]=Edge(v,cap,0,head[u]);
  22.     head[u]=tol++;
  23.     edge[tol]=Edge(u,rw,0,head[v]);
  24.     head[v]=tol++;
  25. }
  26.  
  27. bool bfs(int s,int t)
  28. {
  29.     memset(dis,-1,sizeof dis);
  30.     dis[s]=0;
  31.     queue<int> que;
  32.     que.push(s);
  33.     while (!que.empty())
  34.     {
  35.         int u=que.front();que.pop();
  36.         for (int i=head[u];~i;i=edge[i].nex)
  37.         {
  38.             int v=edge[i].to;
  39.             if (dis[v]==-1 && edge[i].cap>edge[i].flow)
  40.             {
  41.                 dis[v]=dis[u]+1;
  42.                 if (v==t) return true;
  43.                 que.push(v);
  44.             }
  45.         }
  46.     }
  47.     return false;
  48. }
  49.  
  50. int dfs(int x,int t,int cap)
  51. {
  52.     if (x==t) return cap;
  53.     int flow=0,f;
  54.     for (int i=head[x];~i;i=edge[i].nex)
  55.     {
  56.         int v=edge[i].to;
  57.         if (dis[v]==dis[x]+1 && edge[i].cap>edge[i].flow)
  58.         {
  59.             f=dfs(v,t,min(cap-flow,edge[i].cap-edge[i].flow));
  60.             edge[i].flow +=  f;
  61.             edge[i^1].flow -= f;
  62.             flow +=f;
  63.             if (flow == cap) break;
  64.         }
  65.     }
  66.     if (!flow) dis[x]=-1;//加速
  67.     return flow;
  68. }
  69.  
  70. int dicnic(int s,int t)//起点和终点标号
  71. {
  72.     int flow=0,f;
  73.     while (bfs(s,t))
  74.         while ((f=dfs(s,t,inf))>0)
  75.             flow += f;
  76.     return flow;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement