Cod sursa(job #1916949)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 9 martie 2017 10:44:06
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

vector <int> ls[1005];
const int mod = 6005, f_mare = 1000000002;
bool incoada[1005], viz[1005];
int cap[1005][1005], x, y, c, n, m, i, j, v;
int flx[1005][1005], tt[1005];
int coada[mod], st, dr, fmin, sol;

bool parcurg() {
    int i, j, l, y;
    memset(viz, 0, sizeof(viz));
    coada[st=dr=0] = 1;
    viz[1] = 1;
    while (st <= dr) {
        x = coada[st%mod], st++;
        l = ls[x].size();
        if (x==n) continue;
        for (i = 0; i < l; i++) {
            y = ls[x][i];
            if (cap[x][y] - flx[x][y] > 0 && viz[y] == 0) {
                tt[y] = x;
                viz[y] = 1;
                dr++, coada[dr%mod] = y;
            }
        }
    }
    return viz[n];
}

int main() {
    f >> n >> m;
    while (m--) {
        f >> x >> y >> c;
        ls[x].push_back(y);
        ls[y].push_back(x);
        cap[x][y] += c;
    }
    while (parcurg() == 1) {
            bool ok = 0;
        for (i = 0; i < ls[n].size(); i++)  {
            y = ls[n][i];
            if (cap[y][n] - flx[y][n] > 0) {
                tt[n] = y;
                v = n;
                //cout<<1;
                fmin = f_mare;
                while (v > 1 && ok == 0) {
                    c = cap[tt[v]][v] - flx[tt[v]][v];
                    if (c <= 0)
                        ok = 1;
                    fmin = min(fmin, c);
                    v = tt[v];
                }
                if (ok) continue;

                v = n;
                while (v >1) {
                    flx[tt[v]][v] += fmin;
                    flx[v][tt[v]] -= fmin;
                    v = tt[v];
                }
                sol += fmin;
            }
        }
    }
    g << sol;
    return 0;
}