zoukankan      html  css  js  c++  java
  • 最大流算法---Edmond-Karp

    这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE^2).

    模板代码如下:

     1 #include<iostream>
     2 #include<queue>
     3 #include<cstring>
     4 #include<cstdio>
     5 #define MAX 1000
     6 using namespace std;
     7 int res[MAX][MAX];
     8 int vis[MAX], pre[MAX];
     9 queue<int>q;
    10 int n;
    11 bool bfs(int s, int t)
    12 {
    13     int p;
    14     memset(vis, 0, sizeof(vis));
    15     memset(pre, -1, sizeof(pre));
    16     while(!q.empty() q.pop();
    17     q.push(s);
    18     vis[s] = 1;
    19     while(!q.empty())
    20     {
    21         p = q.front();
    22         q.pop();
    23         for(int i = 1;i <= n;i ++)
    24         {
    25             if(!vis[i] && res[p][i] > 0)
    26             {
    27                 pre[i] = p;
    28                 vis[i] = 1;
    29                 if(i == t)
    30                     return true;
    31                 q.push(i);
    32             }
    33         }
    34     }
    35     return false;
    36 }
    37 
    38 int EdmondKarp(int s, int t)
    39 {
    40     int flow = 0, d, i, u;
    41     while(bfs(s, t))
    42     {
    43         d = 1 << 30;
    44         u = t;
    45         while(pre[u] != -1)
    46         {
    47             d = min(d, res[pre[u]][u]);
    48             u = pre[u];
    49         }
    50         u = t;
    51         while(pre[u] != -1)
    52         {
    53             res[pre[u]][u] -= d;
    54             res[u][pre[u]] += d;
    55             u = pre[u];
    56         }
    57         flow += d;
    58     }
    59     return flow;
    60 }
    61 
    62 int main(int argc, char const *argv[]) 
    63 {
    64     int m, u, v, w;
    65     freopen("in.c", "r", stdin);
    66     while(cin >> n >> m)
    67     {
    68         memset(res, 0, sizeof(res));
    69         for(int i = 0;i < m;i ++)
    70         {
    71             cin >> u >> v >> w;
    72             res[u][v] += w;
    73         }
    74         int ans = EdmondKarp(1, n);
    75         cout << ans << endl;
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    bzoj4598: [Sdoi2016]模式字符串
    bzoj3156: 防御准备
    bzoj1966: [Ahoi2005]VIRUS 病毒检测
    bzoj3170: [Tjoi2013]松鼠聚会
    bzoj3171: [Tjoi2013]循环格
    POJ1068Parencodings
    2013年山东省第四届ACM大学生程序设计竞赛 Alice and Bob
    POJ2632Crashing Robots
    POJ1328Radar Installation
    POJ2586Y2K Accounting Bug
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3583366.html
Copyright © 2011-2022 走看看