Cod sursa(job #3041762)

Utilizator AndreiBadAndrei Badulescu AndreiBad Data 1 aprilie 2023 14:39:27
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <climits>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

const int NMAX = 1e3 + 5;

int c[NMAX][NMAX];
int f[NMAX][NMAX];
int predecessor[NMAX];

int n, m;

bitset <NMAX> visited;
vector <int> nearby[NMAX];
queue <int> processing;

int BF() {

    for (auto i = 1; i <= n; i++) {
        visited[i] = false;
    }

    visited[1] = true;
    processing.push(1);

    while(!processing.empty()) {
        int current = processing.front();
        processing.pop();

        if (current == n) {
            continue;
        }

        for (auto next: nearby[current]) {
            if (c[current][next] == f[current][next] || visited[next]) {
                continue;
            }

            visited[next] = true;
            processing.push(next);
            predecessor[next] = current;
        }
    }

    return visited[n];
}

int main() {
    cin >> n >> m;

    int flow, fmin;

    for (auto i = 1; i <= m; i++) {
        int x, y, cost;
        cin >> x >> y >> cost;

        nearby[x].push_back(y);
        nearby[y].push_back(x);
        c[x][y] += cost;
    }

    for (flow = 0; BF(); ) {
        for (int before: nearby[n]) {
            if (c[before][n] == f[before][n] || !visited[before]) {
                continue;
            }

            predecessor[n] = before;
            fmin = INT_MAX;

            for (int node = n; node != 1; node = predecessor[node]) {
                fmin = min(fmin, c[predecessor[node]][node] - f[predecessor[node]][node]);
            }

            if (fmin == 0) {
                continue;
            }

            for (int node = n; node != 1; node = predecessor[node]) {
                f[predecessor[node]][node] += fmin;
                f[node][predecessor[node]] -= fmin;
            }

            flow += fmin;
        }
    }

    cout << flow;
}