Cod sursa(job #2171618)

Utilizator CammieCamelia Lazar Cammie Data 15 martie 2018 12:56:14
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define MAXN 1005

using namespace std;

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

int N, M, sol, c[MAXN][MAXN], f[MAXN][MAXN];
int dad[MAXN], viz[MAXN];

vector <int> graph[MAXN];
queue <int> Q;

void Read() {
    int x, y, z;

    fin >> N >> M;

    for (int i = 1; i <= M; i++) {
        fin >> x >> y >> z;

        graph[x].push_back(y);
        graph[y].push_back(x);

        c[x][y] = z;
    }
}

inline void Refa(int node) {
    int nod = node, minim = 0x3f3f3f3f;

    while (dad[nod]) {
        minim = min(minim, c[dad[nod]][nod] - f[dad[nod]][nod]);
        nod = dad[nod];
    }

    while (dad[node]) {
        f[dad[node]][node] += minim;
        f[node][dad[node]] -= minim;

        node = dad[node];
    }

    //if (minim) ok = 1;

    sol += minim;
}

inline int BFS(int start) {
    int z;

    Q.push(start); memset(viz, 0, sizeof(viz));
    viz[start] = 1; dad[1] = 0;

    while (!Q.empty()) {
        z = Q.front();

        for (auto x : graph[z]) {
            if (x == N)
                continue;
            if (viz[x] == 0 && c[z][x] - f[z][x] > 0) {
                Q.push(x); dad[x] = z; viz[x] = 1;
            }
        }

        Q.pop();
    }

    int ok = 0;

    for (auto x : graph[N]) {
        if (viz[x] == 1 && c[x][N] - f[x][N] > 0) {
            dad[N] = x;
            Refa(N); ok = 1;
        }
    }
    return ok;
}

void Solve() {
    while (BFS(1));

    fout << sol;
}

int main () {
    Read();
    Solve();

    fin.close(); fout.close(); return 0;
}