Cod sursa(job #2674600)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 19 noiembrie 2020 18:03:29
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

constexpr int INF = 2e9;
constexpr int NMAX = 1e3 + 5;

vector <int> G[NMAX];

int cap[NMAX][NMAX];
int flow[NMAX][NMAX];

int n, m;

int tata[NMAX];

bool exista_drum (int start)
{
    queue <int> Q;
    for (int i=1; i<=n; ++i)
        tata[i] = -1;
    Q.push(start);
    tata[start] = 0;

    while (!Q.empty())
    {
        int nod = Q.front();
        Q.pop();

        for (auto it : G[nod])
        {
            if (tata[it] == -1 && cap[nod][it] != flow[nod][it])
            {
                tata[it] = nod;
                if (it == n)
                    return 1;
                Q.push(it);
            }
        }
    }

    return 0;
}

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

    for (int i=1; i<=m; ++i)
    {
        int x, y, z;
        f >> x >> y >> z;

        cap[x][y] = z;
        flow[x][y] = flow[y][x] = 0;

        G[x].push_back(y);
        G[y].push_back(x);
    }

    int ans = 0;

    while (exista_drum(1))
    {
        for (auto it : G[n])
        {
            if (tata[it] == -1) continue;
            int nod = it;
            int sol = cap[it][n] - flow[it][n];

            while (tata[nod] > 0)
            {
                sol = min(sol, cap[tata[nod]][nod] - flow[tata[nod]][nod]);
                nod = tata[nod];
            }

            flow[it][n] += sol;

            nod = it;
            ans = ans + 1LL * sol;

            while (tata[nod] > 0)
            {
                flow[tata[nod]][nod] += sol;
                nod = tata[nod];
            }
        }
    }

    g << ans << '\n';
    return 0;
}