Cod sursa(job #2884053)

Utilizator alex_braslasuBraslasu Alexandru alex_braslasu Data 2 aprilie 2022 12:27:37
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n, m, x, y, i, S, D, TOTAL, T[1010], c[1010][1010], f[1010][1010];
vector<int > G[1010];
queue<int > q;

static inline int BFS()
{
    for (int i = 1; i <= n; ++i)
        T[i] = 0;
    int ok = 0;
    T[S] = -1;
    q.push(S);
    while (!q.empty())
    {
        int nod = q.front();
        q.pop();
        for (auto it : G[nod])
            if (!T[it] && c[nod][it] > f[nod][it])
            {
                if (it != D)
                {
                    T[it] = nod;
                    q.push(it);
                }
                else
                    ok = 1;
            }
    }
    return ok;
}

static inline void dinic()
{
    while (BFS())
        for (auto it : G[D])
            if (T[it] && c[it][D] > f[it][D])
            {
                T[D] = it;
                int mini = (1LL << 31) - 1;
                int nod = D;
                while (nod != S)
                {
                    if (c[T[nod]][nod] - f[T[nod]][nod] < mini)
                        mini = c[T[nod]][nod] - f[T[nod]][nod];
                    nod = T[nod];
                }
                if (mini <= 0)
                    continue;
                TOTAL += mini;
                nod = D;
                while (nod != S)
                {
                    f[T[nod]][nod] += mini;
                    f[nod][T[nod]] -= mini;
                    nod = T[nod];
                }
            }
}

int main()
{
    ios::sync_with_stdio(false);
    fin.tie(nullptr);
    fin >> n >> m;
    for (i = 1; i <= m; ++i)
    {
        fin >> x >> y;
        fin >> c[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
    S = 1; D = n;
    dinic();
    fout << TOTAL;
    return 0;
}