Cod sursa(job #2750176)

Utilizator Turturica_DorinTurturica Dorin Turturica_Dorin Data 10 mai 2021 08:36:21
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.83 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define INTMAX (1<<30)

class muchie {
public:
    int v, f, c; // capatul muchiei, flux, capacitate
};

class muchie_reziduala {
public:
    int v, c;
};

void init(vector<vector<muchie>>& G, vector<vector<muchie_reziduala>>& Gr, vector<int>&e, vector<int>&h, int n, int s, int d) {
    int u;
    h[s] = n;
    for (auto& mu : G[s]) {
        e[mu.v] = mu.c;
        Gr[mu.v].push_back({ s, mu.c });
        //mu.f = mu.c;
        e[s] -= mu.c;
    }
    //graf rezidual
    for (u = 1; u <= n; u++) {
        for (const auto& mu : G[u]) {
            Gr[u].push_back(muchie_reziduala{mu.v, mu.c});
            Gr[mu.v].push_back(muchie_reziduala{ u, 0 });
        }
    }
}

void pompare(vector<vector<muchie_reziduala>>& Gr, vector<int>& e, int u, muchie_reziduala& v) {
    int delta = min(e[u], v.c);
    e[u] -= delta;
    e[v.v] += delta;
    v.c -= delta;
    for (auto& mu : Gr[v.v]) {
        if (mu.v == u) {
            mu.c += delta;
            break;
        }
    }
}

void inaltare(vector<int>& h, int u) {
    h[u] += 1;
}

int pompare_preflux(vector<vector<muchie>>& G, int n, int s, int d) {
    vector< vector<muchie_reziduala> >Gr(n+1); // size n
    vector<int>e( n+1, 0 ), h( n+1, 0 ); // exces si inaltime a nodurilor | init pe 0
    int u;
    bool pompat, aceeasi_stare;
    init(G, Gr, e, h, n, s, d);
    while (1) {
        aceeasi_stare = 1;
        for (u = 2; u <= n - 1; u++) {
            if (e[u] <= 0) // daca nu am exces
                continue;
            aceeasi_stare = 0;
            pompat = 0;
            for (auto& mu : Gr[u]) {
                if (mu.c <= 0) // nu exista muchia
                    continue;
                if (h[u] > h[mu.v]) {
                    pompat = 1;
                    pompare(Gr, e, u, mu);
                    continue;
                }
            }
            if (pompat == 0) {
                inaltare(h, u);
                continue;
            }
        }
        if (aceeasi_stare == 1)
            break;
    }
    return e[n];
}

int main() {
    vector< vector<muchie> >G; // {flux, capacitate}
    int n, m, i, x, y, z;
    fin >> n >> m;
    G.resize(n+1);
    for (i = 1; i <= m; i++) {
        fin >> x >> y >> z;
        G[x].push_back({y,0,z});
    }
    fout<<pompare_preflux(G, n, 1, n);
}

/*vector< vector<muchie> >Gr(n);
    vector<int>e( n );
    for (auto el : e) {
        cout << el << ' ';
    }
    i = 0;
    cout << G[4].empty();
    G[4].resize(2);
    cout<<G[4].empty();
    for (auto l : G) {
        cout << i++ << ": ";
        for (auto el : l) {
            cout << el.second<<' ';
        }
        cout << '\n';
    }*/