Cod sursa(job #3355737)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 25 mai 2026 15:35:21
Problema Flux maxim Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <vector>
#include <limits.h>
#include <queue>

using namespace std;

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

const int NMAX = 1e3 + 1;
int n, m;

struct FlowEdge
{
    int u, indexResidual = 0;
    long long cap, flow = 0;

    FlowEdge(int u, long long cap, int indexResidual) : u(u), cap(cap), indexResidual{indexResidual} {}
};

vector<FlowEdge> g[NMAX];
vector<int> lvl;

bool BFS()
{
    lvl = vector<int>(n + 1, -1);
    lvl[1] = 0;
    queue<int> q;
    q.push(1);

    while (!q.empty())
    {
        int crt = q.front();
        q.pop();
        for (auto x : g[crt])
        {
            if (x.cap == x.flow || lvl[x.u] != -1)
                continue;
            lvl[x.u] = lvl[crt] + 1;
            q.push(x.u);
        }
    }
    return lvl[n] != -1;
}

long long DFS(int x, long long pushed)
{
    if (pushed == 0 || x == n)
        return pushed;

    for (auto &y : g[x])
    {
        if (lvl[y.u] != lvl[x] + 1)
            continue;
        long long tr = DFS(y.u, min(pushed, y.cap - y.flow));
        if (tr == 0)
            continue;
        y.flow += tr;
        g[y.u][y.indexResidual].flow -= tr;
        return tr;
    }
    return 0;
}

long long maxFlow()
{
    long long f = 0;
    while (true)
    {
        if (!BFS())
            return f;
        while (long long pushed = DFS(1, INT_MAX))
            f += pushed;
    }
    return f;
}

int main()
{
    int x, y, c;
    fin >> n >> m;
    for (int i = 1; i <= m; ++i)
    {
        fin >> x >> y >> c;
        g[x].push_back({y, c, static_cast<int>(g[y].size())});
        g[y].push_back({x, 0, static_cast<int>(g[x].size())});
    }
    fout << maxFlow() << '\n';
    return 0;
}