Cod sursa(job #2553474)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 22 februarie 2020 00:14:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

#define pii pair <int, int>
#define x first
#define y second

using namespace std;

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

struct Edge {
    int to, cap;
};

vector <Edge> edgs;
vector <int> g[1001];

int n, m;
bool f[1001];
pii tata[1001];

inline bool BFS() {
    queue <int> q;
    memset(f, 0, sizeof(f));
    f[1] = true;
    q.push(1);
    while (!q.empty()) {
        int nod = q.front();
        q.pop();
        if (nod == n)
            continue;
        for (auto i : g[nod]) {
            if (edgs[i].cap > 0 && !f[edgs[i].to]) {
                q.push(edgs[i].to);
                f[edgs[i].to] = true;
                tata[edgs[i].to] = {nod, i};
            }
        }
    }
    return f[n];
}

int main() {
    int u, v, c;
    in >> n >> m;
    edgs.reserve((m << 1));
    for (int i = 1; i <= m; ++i) {
        in >> u >> v >> c;
        g[u].push_back(edgs.size());
        edgs.push_back({v, c});
        g[v].push_back(edgs.size());
        edgs.push_back({u, 0});
    }
    int rez = 0;
    while (BFS()) {
        for (auto i : g[n]) {
            int minc = edgs[i ^ 1].cap, fiu = edgs[i].to;
            if (!f[fiu])
                continue;
            for (int nod = fiu; nod != 1 && minc > 0; nod = tata[nod].x)
                minc = min(minc, edgs[tata[nod].y].cap);
            if (minc <= 0)
                continue;
            edgs[i].cap += minc;
            edgs[i ^ 1].cap -= minc;
            for (int nod = fiu; nod != 1; nod = tata[nod].x) {
                edgs[tata[nod].y ^ 1].cap += minc;
                edgs[tata[nod].y].cap -= minc;
            }
            rez += minc;
        }
    }
    return out << rez, 0;
}