Cod sursa(job #2689646)

Utilizator AlexVulpoiuAlexandru Vulpoiu AlexVulpoiu Data 21 decembrie 2020 18:52:05
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
/// Edmonds-Karp, O(N * M^2)
#include <fstream>
#include <vector>

using namespace std;

int n, m, i, j, k, flx, min1;
int bfs[1005], tata[1005], c[1005][1005], flux[1005][1005];
bool viz[1005];
vector<int> graf[1005];

int BFS() {
    for(i = 1; i <= n; i++)
        viz[i] = false;
    m = 1;
    bfs[0] = 1;
    viz[1] = true;  /// BFS in graful rezidual, plecand din 1
    for(i = 0; i < m; i++) {
        k = bfs[i];
        for(j = 0; j < graf[k].size(); j++)
            if(!viz[graf[k][j]] && flux[k][graf[k][j]] < c[k][graf[k][j]]) {   /// daca vecinul curent nu este vizitat si muchia nu este folosita la
                viz[graf[k][j]] = true;                                         /// capacitate maxima
                bfs[m++] = graf[k][j];
                tata[graf[k][j]] = k;
                if(graf[k][j] == n)
                    return 1;
            }
    }

    return 0;
}

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

    f >> n >> m;
    while(m) {
        f >> i >> j >> k;

        graf[i].push_back(j);
        graf[j].push_back(i);   /// adaugam si muchia inversa in graf
        c[i][j] = k;    /// capacitatile muchiilor

        m--;
    }
    f.close();

    flx = 0;
    while(BFS()) {   /// cat timp exista un drum de la sursa la destinatie in graful rezidual
        min1 = 2000000000;
        for(i = n; i != 1; i = tata[i])
            min1 = min(min1, c[tata[i]][i] - flux[tata[i]][i]);     /// calculez valoare cu care pot imbunatati fluxul pe drumul gasit
        for(i = n; i != 1; i = tata[i]) {
            flux[tata[i]][i] += min1;
            flux[i][tata[i]] -= min1;
        }
        flx += min1;
    }

    g << flx << '\n';
    g.close();

    return 0;
}