Cod sursa(job #3004446)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 16 martie 2023 12:31:01
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>

#define DIM 1005

using namespace std;

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

int n, m, c[DIM][DIM], t[DIM];
vector<int> edges[DIM];
queue<int> q;
bitset<DIM> v;

bool bfs() {
    bool ok = 0;

    v.reset();
    v[1] = 1;
    q.push(1);

    while (!q.empty()) {
        int node = q.front();
        q.pop();
        for (auto child: edges[node]) {
            if (c[node][child] > 0 && !v[child]) {
                q.push(child);
                v[child] = 1;
                t[child] = node;
                if (child == n) {
                    ok = 1;
                }
            }
        }
    }

    return ok;
}


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

    for (int i = 1; i <= m; i++) {
        int x, y, flux;
        f >> x >> y >> flux;
        edges[x].push_back(y);
        edges[y].push_back(x);
        c[x][y] = flux;
    }

    int flux = 0;
    while (bfs()) {
        for (auto node: edges[n]) {
            if (c[node][n] && v[node]) {
                int minim = c[node][n];
                int p = node;
                while (t[p]) {
                    minim = min(minim, c[t[p]][p]);
                    p = t[p];
                }

                flux += minim;

                c[node][n] -= minim;
                c[n][node] += minim;

                p = node;
                while (t[p]) {
                    c[t[p]][p] -= minim;
                    c[p][t[p]] += minim;
                    p = t[p];
                }
            }
        }
    }

    g << flux;
    return 0;
}