zoukankan      html  css  js  c++  java
  • 最大流算法 Dinic算法 ADT

    https://www.cnblogs.com/SYCstudio/p/7260613.html

    这个博主写的很好完全看得懂就不自己写了

    方便自己使用还是把模板抄出来吧。

    ADT:

     1 const int max_e = 55000;
     2 const int max_v = 250;
     3 const int INF = 0x3f3f3f3f; //可能有时候要用Long Long
     4 
     5 struct Edge{
     6     int from,to,cap;  //很多时候要用long long int cap,因为可能不够
     7     int next; //也可以用vector来存 从from出来的下一条边
     8 }edges[max_e];
     9 int head[max_v]; //第一个从这个点出来的边对应的序号
    10 int cnt; //边的数量
    11 int Depth[max_v];
    12 int f[max_e];
    13 int S,T;
    14 
    15 void init(){
    16     cnt = 0;
    17     memset(head,-1,sizeof(head));
    18     memset(f,0,sizeof(f));
    19 }
    20 
    21 void AddEdge(int f, int t, int cap){
    22     edges[cnt].from = f;
    23     edges[cnt].to = t;
    24     edges[cnt].cap = cap;
    25     edges[cnt].next = head[f];
    26     head[f] = cnt;
    27     cnt++;
    28     //??????????
    29     edges[cnt].from = t;
    30     edges[cnt].to = f;
    31     edges[cnt].cap = 0; //反向边
    32     edges[cnt].next = head[t];
    33     head[t] = cnt;
    34     cnt++;
    35     
    36 }
    37 
    38 bool bfs(){
    39     queue<int>Q;
    40     while(!Q.empty()) Q.pop();
    41     memset(Depth,0,sizeof(Depth));
    42     Depth[S] = 1;
    43     Q.push(S);
    44     while(!Q.empty()){
    45         int u = Q.front();
    46         Q.pop();
    47         for(int i=head[u];i!=-1;i=edges[i].next){
    48             int t = edges[i].to;
    49             if((Depth[t]==0)&&edges[i].cap>f[i]){
    50                 Depth[t] = Depth[u] + 1;
    51                 Q.push(t);
    52             }
    53         }
    54     }
    55     if(Depth[T]>0){
    56         return 1;
    57     }
    58     return 0;
    59 }
    60 
    61 int dfs(int u, int dist){ //当前节点,当前流量
    62     if(u==T) return dist;
    63     for(int i=head[u];i!=-1&&dist;i=edges[i].next){
    64         int t = edges[i].to;
    65         if(Depth[t]==(Depth[u]+1)&&edges[i].cap>f[i]){
    66             int di = dfs(t,min(dist,edges[i].cap-f[i]));
    67             if(di>0){//增广成功
    68                 f[i] += di;
    69                 f[i^1] -= di;
    70                 return di;
    71             }
    72         }
    73     }
    74     
    75     return 0;
    76 }
    77 
    78 int dinic(){
    79     int ans=0;
    80     while(bfs()){
    81         while(int d=dfs(S,INF)) {
    82             ans += d;
    83         }
    84     }
    85     return ans;
    86 }
    View Code
  • 相关阅读:
    [Dynamic Language] Python Django: 模板引擎(1)基本使用
    [ASM C/C++] C函数调用分析
    [Linux] Ubuntu: 相关工具及配置
    xml小练习
    饿汉式懒汉式
    给定一个数组,获取数组中的最大值,以及最小值。
    Fighting
    通过API文档查询Math类的方法,打印出近似圆,只要给定不同半径,圆的大小就会随之发生改变
    对给定数组进行选择排序
    对给定数组进行冒泡排序
  • 原文地址:https://www.cnblogs.com/cmbyn/p/8616359.html
Copyright © 2011-2022 走看看