• 【模板】Dinic算法


     1 #include<vector>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<queue>
     5 #define INF 0x7fffffff
     6 #define MAX_V 210
     7 
     8 using namespace std;
     9 
    10 //用于表示边的结构体
    11 struct edge
    12 {
    13     int to;    //终点
    14     int cap;   //容量
    15     int rev;   //反向边
    16 };
    17 
    18 int m,n;
    19 int iter[MAX_V];         //顶点到源咪的距离标号
    20 int level[MAX_V];        //当前弧,在其之前的边已经没有用了
    21 vector<edge> G[MAX_V];   //图的邻接表表示,多组测试数据时注意初始化(清空)
    22 
    23 //向图中增加一条从from到to的容量为cap的边
    24 void add_edge(int _from,int _to,int _cap)
    25 {
    26     edge temp;
    27     temp.to=_to;
    28     temp.cap=_cap;
    29     temp.rev=G[_to].size();
    30     G[_from].push_back(temp);
    31     temp.to=_from;
    32     temp.cap=0;
    33     temp.rev=G[_from].size()-1;
    34     G[_to].push_back(temp);
    35 }
    36 
    37 //通过BFS计算从源点出发的距离标号
    38 void bfs(int s)
    39 {
    40     memset(level,-1,sizeof(level));
    41     queue<int> que;
    42     level[s]=0;
    43     que.push(s);
    44     while(!que.empty())
    45     {
    46         int v=que.front();
    47         que.pop();
    48         for(int i=0;i<G[v].size();i++)
    49         {
    50             edge &e=G[v][i];
    51             if(e.cap>0&&level[e.to]<0)
    52             {
    53                 level[e.to]=level[v]+1;
    54                 que.push(e.to);
    55             }
    56         }
    57     }
    58 }
    59 
    60 //通过DFS寻找增广路
    61 int dfs(int v,int t,int f)
    62 {
    63     if(v==t)
    64         return f;
    65 
    66     for(int &i=iter[v];i<G[v].size();i++)
    67     {
    68         edge &e=G[v][i];
    69         if(e.cap>0&&level[v]<level[e.to])
    70         {
    71             int d=dfs(e.to,t,min(f,e.cap));
    72             if(d>0)
    73             {
    74                 e.cap-=d;
    75                 G[e.to][e.rev].cap+=d;
    76                 return d;
    77             }
    78         }
    79     }
    80 
    81     return 0;
    82 }
    83 
    84 //求解从s到t的最大流
    85 int max_flow(int s,int t)
    86 {
    87     int flow=0;
    88 
    89     while(true)
    90     {
    91         bfs(s);
    92         if(level[t]<0)
    93             return flow;
    94         memset(iter,0,sizeof(iter));
    95         int f;
    96         while((f=dfs(s,t,INF))>0)
    97             flow+=f;
    98     }
    99 }
  • 相关阅读:
    disconf 2.6.36 install
    Kubernetes 1.6.1 Kargo
    50个必备的实用jQuery代码段
    jquery封装插件
    java读取txt文件
    file 创建 txt文件
    想要学习web前端的童鞋们 可以看看哦 ! 我认为这几本书超不错
    jquery 杂记
    以文件流的方式 文件上传 下载
    陌生单词记录
  • 原文地址:https://www.cnblogs.com/lzj-0218/p/3565998.html
Copyright © 2020-2023  润新知