zoukankan      html  css  js  c++  java
  • poj1273(Edmonds-Karp)

    这道题可以算是例题了。

    求解最大流,采用EK算法,用广搜查找增广路径,找到后更新网络流矩阵,循环执行直至找不到增广路径为止。这里要小心的是重复边的情况。

    程序也是参照了网上的模版来写的,有一些技巧。如果完全让我自己来实现这个算法,会写的比较难看。还是too young

    #include <iostream>
    #include <queue>
    using namespace std;
    
    const int MAX_N = 201;
    const int INF = INT_MAX;
    
    int n, m;int flow[MAX_N][MAX_N];
    int cap[MAX_N][MAX_N];
    int sum;
    int pre[MAX_N];
    int a[MAX_N];
    
    void Edomds_Karp()
    {
        while (1){
            memset(a, 0, sizeof(a));
            a[s] = INF;
            queue<int> Q;
            Q.push(1);
            while (!Q.empty()){
                int u = Q.front();
                Q.pop();
                for (int v = 1; v <= m; v++){
                    if (!a[v] && flow[u][v] < cap[u][v]){
                        Q.push(v);
                        int tmp = cap[u][v] - flow[u][v];
                        a[v] = a[u] > tmp ? tmp : a[u];
                        pre[v] = u;
                    }
                }
            }
            if (a[m] == 0){
                break;
            }
            sum += a[m];
            for (int i = m; i != s; i = pre[i]){
                flow[pre[i]][i] += a[m];
                flow[i][pre[i]] -= a[m];
            }
        }
    }
    
    int main()
    {
        while (cin >> n >> m){
            memset(flow, 0, sizeof(flow));
            memset(cap, 0, sizeof(cap));
            sum = 0;
            for (int i = 1; i <= n; i++){
                int s, e, c;
                cin >> s >> e >> c;
                cap[s][e] += c;
            }
            Edomds_Karp();
            cout << sum << endl;
        }
        return 0;
    }
  • 相关阅读:
    什么是函数式编程
    红包算法
    laravel中查看执行的SQL语句
    身份证号信息后台匹配
    在函数内部访问外部的变量
    设计模式-观察者模式
    laravel查询构造器操作数据库
    linux根目录文件夹的作用
    关于laravel连接数据库报错
    设定起始日期,遍历到今天的日期
  • 原文地址:https://www.cnblogs.com/caiminfeng/p/4969391.html
Copyright © 2011-2022 走看看