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 }
  • 相关阅读:
    light oj 1105 规律
    light oj 1071 dp(吃金币升级版)
    light oj 1084 线性dp
    light oj 1079 01背包
    light oj 1068 数位dp
    light oj 1219 树上贪心
    light oj 1057 状压dp TSP
    light oj 1037 状压dp
    矩阵快速幂3 k*n铺方格
    矩阵快速幂2 3*n铺方格
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3583366.html
Copyright © 2011-2022 走看看