Cod sursa(job #239069)

Utilizator filipbFilip Cristian Buruiana filipb Data 3 ianuarie 2009 23:48:04
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <vector>

using namespace std;

#define minim(a, b) ((a < b) ? a : b)
#define NMax 1024

int N, M, f[NMax][NMax], cap[NMax][NMax];
vector<int> G[NMax];

int q[NMax], up[NMax];
inline int BF(int sursa, int dest)
{
    int ql, qr, sz, x, i;
    
    memset(up, -1, sizeof(up));
    for (q[qr=ql=0]=sursa, up[sursa]=0; qr <= ql; ++qr)
        for (sz = G[q[qr]].size(), i = 0; i < sz; ++i)
            if (up[x = G[q[qr]][i]] == -1 && f[q[qr]][x] < cap[q[qr]][x])
            {
                q[++ql] = x;
                up[x] = q[qr];
                if (x == dest)
                    return 1;
            }
    return 0;
}

int max_flow()
{
    int i, j, r, cnt = 0;
    
    for (; BF(1, N); )
    {
        for (i = 1; i < N; ++i)
            if (up[i] != -1 && f[i][N] < cap[i][N])
            {
                r = cap[i][N] - f[i][N];
                for (j = i; j != 1 && r > 0; j = up[j])
                    r = minim(r, cap[up[j]][j] - f[up[j]][j]);
                if (r == 0) continue;
                
                f[i][N] += r; f[N][i] -= r;
                for (j = i; j != 1; j = up[j])
                    f[up[j]][j] += r,
                    f[j][up[j]] -= r;
                cnt += r;
            }
    }
    return cnt;
}

int main()
{
    int i, j;
    
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    scanf("%d %d", &N, &M);
    assert(1 <= N && N <= 1000);
    assert(1 <= M && M <= 5000);
    for (; M; --M)
    {
        scanf("%d %d", &i, &j);
        G[i].push_back(j);
        G[j].push_back(i);
        scanf("%d", &cap[i][j]);
        assert(1 <= cap[i][j] && cap[i][j] <= 110000);
    }

    printf("%d\n", max_flow());

    return 0;
}