Cod sursa(job #2485616)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 1 noiembrie 2019 20:06:13
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

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

constexpr int INF = 0x3f3f3f3f;
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))
    {
        int nod = n;
        int sol = INF;

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

        nod = n;
        ans = ans + sol;

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

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