Cod sursa(job #1212312)

Utilizator acomAndrei Comaneci acom Data 24 iulie 2014 13:34:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <cstring>
#define DIM 1010

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

vector<int> L[DIM];
int C[DIM][DIM], F[DIM][DIM];
int v[DIM], T[DIM], q[DIM];

int n, m, x, y, z, i, flux, minim;

int bfs() {
    memset(v, 0, sizeof(v));
    int p = 1, u = 1, x, y;
    q[1] = 1;
    v[1] = 1;
    T[1] = 0;
    while (p <= u) {
        x = q[p];
        for (int i=0;i<L[x].size();i++) {
            y = L[x][i];
            if (v[y] == 0 && C[x][y] > F[x][y]) {
                u++;
                q[u] = y;
                T[y] = x;
                v[y] = 1;
            }
        }
        p++;
    }
    return v[n];
}

int main() {
    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y] = z;
    }

    while (bfs()) {
        for (int i=0;i<L[n].size(); i++) {
            x = L[n][i];
            if (v[x] == 1 && C[x][n] > F[x][n]) {
                minim = C[x][n] - F[x][n];
                while (T[x]) {
                    minim = min( minim, C[T[x]][x] - F[T[x]][x]);
                    x = T[x];
                }
                flux += minim;
                x = L[n][i];
                F[x][n] += minim;
                F[n][x] -= minim;
                while (T[x]) {
                    F[ T[x] ][x] += minim;
                    F[x][ T[x] ] -= minim;
                    x = T[x];
                }
            }
        }

    }
    fout<<flux;
    return 0;
}