#include <iostream>
#include <queue>
#include <string.h>
#define MAX 302

using namespace std;

int c[MAX][MAX];
int pre[MAX];
int visited[MAX];
int n, m;

bool Path(int src, int des)
{
    queue <int> q;

    for (int i = 0; i <= m; i++)
    {
        visited[i] = 0;
        pre[i] = 0;
    }

    q.push(src);
    visited[src] = 1;

    while (!q.empty())
    {
        int cur = q.front();
        q.pop();

        for (int i = 1; i <= m; i++)
        {
            if (!visited[i] && c[cur][i])
            {
                q.push(i);
                pre[i] = cur;
                visited[i] = 1;
                if (i == des)
                {
                    return true;
                    break;
                }
            }
        }
    }
    return false;
}

int EK(int src, int des)
{
    int min, i, total = 0;

    while (true)
    {
        if (!Path(src, des))
        {
            break;
        }

        i = des;
        min = (1 << 30);
        while (i != src)
        {
            if (min > c[pre[i]][i])
            {
                min = c[pre[i]][i];
            }
            i = pre[i];
        }

        i = des;
        while (i != src)
        {
            c[pre[i]][i] -= min;
            c[i][pre[i]] += min;
            i = pre[i];
        }

        total += min;
    }

    return total;
}
int main()
{
    int a, b, f;
    while (cin >> n >> m)
    {
        memset(c, 0, sizeof(c));
        for (int i = 0; i < n; i++)
        {
            cin >> a >> b >> f;
            c[a][b] += f;
        }

        cout << EK(1, m) << endl;
    }
    return 0;
}

网络流的EK算法,主要就是不断的找增广路,如果找到了增广路,说明流量还可以增加,否则输出最大流即可.

找增广路用到bfs,找到后必须更新残量网络,用增广路的最大流更新残量网络.

 

posted on 2013-07-29 19:39  认真的看我  阅读(179)  评论(0编辑  收藏  举报