POJ 1273 Drainage Ditches(最大流)

题目链接:POJ 1273 Drainage Ditches

最大流。

我觉得最大流问题中最重要的是反向弧初值的设置,虽然实现不复杂但是思考起来挺难的。 最大流和费用流问题中使用反向弧的原因

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int MAX_N = 200 + 20;
const int INF = (1 << 30);
int cap[MAX_N][MAX_N],flow[MAX_N][MAX_N],p[MAX_N];
int n,m,s,t;

int maxFlow()
{
    queue<int> q;
    int ans = 0,a[MAX_N];
    while(true)
    {
        q.push(s);
        memset(a, 0, sizeof(a));
        a[s] = INF;
        while (!q.empty())
        {
            int u = q.front();
            q.pop();
            for (int i = 0; i <= t; i++)
            {
                if (!a[i] && cap[u][i] > flow[u][i])
                {
                    p[i] = u;
                    q.push(i);
                    a[i] = min(a[u],cap[u][i] - flow[u][i]);
                }
            }
        }
        if (a[t] == 0)
            break;
        for (int i = t;i != s;i = p[i])
        {
            flow[p[i]][i] += a[t];
            flow[i][p[i]] -= a[t];
        }
        ans += a[t];
    }
    return ans;
}
int main()
{
    while(cin >> n >> m)
    {
        memset(flow,0,sizeof(flow));
        memset(cap,0,sizeof(cap));
        s = 1;
        t = m;
        int a,b,c;
        for(int i = 0;i < n;i++)
        {
            cin >> a >> b >> c;
            cap[a][b] += c;
        }
        cout << maxFlow() << endl;
    }
    return 0;
}


你可能感兴趣的:(POJ 1273 Drainage Ditches(最大流))