Cod sursa(job #742467)

Utilizator deneoAdrian Craciun deneo Data 30 aprilie 2012 13:11:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

#define MAXN 1010
#define INF 1000000

vector<int> g[MAXN];
int n, m, c[MAXN][MAXN], f[MAXN][MAXN], viz[MAXN], cd[MAXN], TT[MAXN];

int BFS() {
    int nod, i, j, v;
    cd[cd[0] = 1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    for (i = 1; i <= cd[0]; ++i) {
        nod = cd[i];
        if (nod == n)
            continue;
        for (j = 0; j < g[nod].size(); ++j) {
            v = g[nod][j];
            if (f[nod][v] == c[nod][v] || viz[v])
                continue;
            TT[v] = nod;
            cd[++cd[0]] = v;
            viz[v] = 1;
        }
    }
    return viz[n];
}

int main() {
    int i, j, v, nod, flow = 0, fmin, x, y, cost;
    fin >> n >> m;
    for (i = 1; i <= m; ++i) {
        fin >> x >> y >> cost;
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y] = cost;
    }
    while (BFS()) {
        for (i = 0; i < g[n].size(); ++i) {
            v = g[n][i];
            fmin = INF;
            if (c[v][n] == f[v][n] || !viz[v])
                continue;
            TT[n] = v;
            for (nod = n; nod != 1; nod = TT[nod])
                fmin = min(fmin, c[ TT[nod] ][nod] - f[ TT[nod] ][nod]);
            for (nod = n; nod != 1; nod = TT[nod]) {
                f[TT[nod]][nod] += fmin;
                f[nod][TT[nod]] -= fmin;
            }
            flow += fmin;
        }
    }
    fout << flow << "\n";
    fout.close();
    return 0;
}