zoukankan      html  css  js  c++  java
  • 最大流(Dinic模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1532

     1 #include<cstdio>
     2  #include<cstring>
     3  #include<queue>
     4  #include<cmath>
     5  using namespace std;
     6  const int Ni = 210;
     7  const int MAX = 1<<26;
     8  struct Edge{
     9      int u,v,c;
    10      int next;
    11  }edge[20*Ni];
    12  int n,m;
    13  int edn;//边数
    14  int p[Ni];//父亲
    15  int d[Ni];
    16  int sp,tp;//原点,汇点
    17 
    18  void addedge(int u,int v,int c)
    19  {
    20      edge[edn].u=u; edge[edn].v=v; edge[edn].c=c;
    21      edge[edn].next=p[u]; p[u]=edn++;
    22 
    23      edge[edn].u=v; edge[edn].v=u; edge[edn].c=0;
    24      edge[edn].next=p[v]; p[v]=edn++;
    25  }
    26  int bfs()
    27  {
    28      queue <int> q;
    29      memset(d,-1,sizeof(d));
    30      d[sp]=0;
    31      q.push(sp);
    32      while(!q.empty())
    33      {
    34          int cur=q.front();
    35          q.pop();
    36          for(int i=p[cur];i!=-1;i=edge[i].next)
    37          {
    38              int u=edge[i].v;
    39              if(d[u]==-1 && edge[i].c>0)
    40              {
    41                  d[u]=d[cur]+1;
    42                  q.push(u);
    43              }
    44          }
    45      }
    46      return d[tp] != -1;
    47  }
    48  int dfs(int a,int b)
    49  {
    50      int r=0;
    51      if(a==tp)return b;
    52      for(int i=p[a];i!=-1 && r<b;i=edge[i].next)
    53      {
    54          int u=edge[i].v;
    55          if(edge[i].c>0 && d[u]==d[a]+1)
    56          {
    57              int x=min(edge[i].c,b-r);
    58              x=dfs(u,x);
    59              r+=x;
    60              edge[i].c-=x;
    61              edge[i^1].c+=x;
    62          }
    63      }
    64      if(!r)d[a]=-2;
    65      return r;
    66  }
    67 
    68  int dinic(int sp,int tp)
    69  {
    70      int total=0,t;
    71      while(bfs())
    72      {
    73          while(t=dfs(sp,MAX))
    74          total+=t;
    75      }
    76      return total;
    77  }
    78  int main()
    79  {
    80      int i,u,v,c;
    81      while(~scanf("%d%d",&m,&n))
    82      {
    83          edn=0;//初始化
    84          memset(p,-1,sizeof(p));
    85          sp=1;tp=n;
    86          for(i=0;i<m;i++)
    87          {
    88              scanf("%d%d%d",&u,&v,&c);
    89              addedge(u,v,c);
    90          }
    91          printf("%d\n",dinic(sp,tp));
    92      }
    93      return 0;
    94  }
  • 相关阅读:
    java实现第六届蓝桥杯立方体自身
    Java实现第八届蓝桥杯包子凑数
    Snapshot Standby
    [NOI2014]购票
    DG的数据保护模式
    严格次小生成树
    Java实现第八届蓝桥杯拉马车
    Java实现第八届蓝桥杯拉马车
    Java实现第八届蓝桥杯迷宫
    在物理 Data Guard 中对异构主备系统的支持 (文档 ID 1602437.1)
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2598197.html
Copyright © 2011-2022 走看看