Cod sursa(job #2167753)

Utilizator CammieCamelia Lazar Cammie Data 13 martie 2018 23:21:23
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

#define MAXN 1005

using namespace std;

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

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

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

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

    fin >> N >> M;

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

        c[x][y] = z;
        graph[x].push_back(y);
    }
}

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];
    }

    sol += minim;
}

inline int BFS(int start) {
    memset(viz, 0, sizeof(viz));
    Q = queue <int> ();
    Q.push(start); viz[start] = 1;

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

        if (z == N) {
            Refa(z);
            return 1;
        }

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

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

    fout << sol;
}

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

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