Cod sursa(job #3270700)

Utilizator radiantstorkAmadeus L radiantstork Data 24 ianuarie 2025 11:15:46
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

void print(std::vector<std::vector<int> > &graf, std::vector<std::vector<int> > &capacitate, const int n) {
    for (int i = 0; i < n; ++i) {
        std::cout << i + 1 << ": ";
        for (const auto &j: graf[i])
            std::cout << "(" << j + 1 << "," << capacitate[i][j] << ") ";
        std::cout << "\n";
    }
    std::cout << "\n";
}

int bfs(std::vector<std::vector<int> > &graf, std::vector<std::vector<int> > &capacitate,
        std::vector<std::vector<int> > &flux, const int n) {
    std::vector viz(n, false);
    std::vector tata(n, -1);
    std::queue<int> q;
    constexpr int src = 0;
    int dest = n - 1;
    q.push(src);
    viz[src] = true;

    while (!q.empty()) {
        const int i = q.front();
        q.pop();
        for (const auto &j: graf[i])
            if (!viz[j])
                if (capacitate[i][j] - flux[i][j] > 0) {
                    q.push(j);
                    viz[j] = true;
                    tata[j] = i;
                }
    }
    if (!viz[dest])
        return 0;

    std::vector<int> drum;
    while (dest != -1) {
        drum.push_back(dest);
        dest = tata[dest];
    }
    std::ranges::reverse(drum);

    int capRezMin = 1e9;
    for (int i = 0; i < static_cast<int>(drum.size()) - 1; ++i) {
        const int u = drum[i];
        const int v = drum[i + 1];
        capRezMin = std::min(capRezMin, capacitate[u][v] - flux[u][v]);
    }
    for (int i = 0; i < static_cast<int>(drum.size()) - 1; ++i) {
        const int u = drum[i];
        const int v = drum[i + 1];
        flux[u][v] += capRezMin;
        flux[v][u] -= capRezMin;
    }
    return capRezMin;
}

void edmondsKarp() {
    std::vector<std::vector<int> > graf;
    std::vector<std::vector<int> > capacitate;
    std::vector<std::vector<int> > flux;
    int n, m;
    int i, j, w;

    std::ifstream file("maxflow.in");
    file >> n >> m;
    graf.resize(n);
    capacitate.resize(n, std::vector(n, 0));
    flux.resize(n, std::vector(n, 0));
    while (m--) {
        file >> i >> j >> w;
        capacitate[i - 1][j - 1] = w;
        graf[i - 1].push_back(j - 1);
        graf[j - 1].push_back(i - 1);
    }
    file.close();

    int fluxMaxim = 0;
    while (const int f = bfs(graf, capacitate, flux, n))
        fluxMaxim += f;

    std::ofstream g("maxflow.out");
    g<<fluxMaxim;
    g.close();
}

int main() {
    edmondsKarp();
    return 0;
}