Cod sursa(job #2754722)

Utilizator kywyPApescu tiGEriu kywy Data 26 mai 2021 13:34:42
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <bits/stdc++.h>
using namespace std;

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

const long long inf = (long long)1e18 + 5;
const long long max_n = (long long)1e3 + 5;

long long n, m;
long long r[max_n][max_n];
vector<long long> g[max_n];
bool visited[max_n];
long long lvl[max_n];

bool bfs()
{
    for (long long i = 1; i <= n; ++i)
    {
        visited[i] = false;
    }
    queue<long long> q;
    visited[1] = true;
    q.push(1);
    lvl[1] = 1;
    while ((long long)q.size() > 0)
    {
        long long u = q.front();
        q.pop();
        for (long long v : g[u])
        {
            if (!visited[v])
            {
                if (r[u][v] > 0)
                {
                    q.push(v);
                    visited[v] = true;
                    lvl[v] = 1 + lvl[u];
                }
            }
        }
    }
    return visited[n];
}

long long dfs(long long u, long long flow)
{
    if (u == n)
    {
        return flow;
    }
    for (long long v : g[u])
    {
        if (!visited[v])
        {
            if (r[u][v] > 0 && lvl[v] == 1 + lvl[u])
            {
                long long res = dfs(v, min(flow, r[u][v]));
                if (res > 0)
                {
                    r[u][v] -= res;
                    r[v][u] += res;
                    return res;
                }
                else
                {
                    visited[v] = true;
                }
            }
        }
    }
    return 0;
}

int main()
{
    in >> n >> m;
    for (long long i = 1; i <= m; ++i)
    {
        long long u, v, c;
        in >> u >> v >> c;
        r[u][v] += c;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    long long flow = 0;
    while (bfs() == true)
    {
        long long pmp;
        fill(visited + 1, visited + n + 1, false);
        while (pmp = dfs(1, inf))
        {
            fill(visited + 1, visited + n + 1, false);
            flow += pmp;
        }
    }
    out << flow << "\n";
    return 0;
}