Cod sursa(job #2499333)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 25 noiembrie 2019 21:38:58
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int N = 1000 + 7;
int n;
int m;
int cap[N][N];
vector<int> g[N];
int level[N];

int dumb(int a, int mn)
{
    if (a == n)
    {
        return mn;
    }
    for (auto &b : g[a])
    {
        if (level[b] == 1 + level[a] && cap[a][b] > 0)
        {
            int x = dumb(b, min(mn, cap[a][b]));
            if (x > 0)
            {
                cap[a][b] -= x;
                cap[b][a] += x;
                return x;
            }
        }
    }
    return 0;
}

int main()
{
    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);

    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].push_back(b);
        g[b].push_back(a);
        cap[a][b] += c;
    }
    int ans = 0;
    while (1)
    {
        for (int i = 1; i <= n; i++)
        {
            level[i] = -1;
        }
        level[1] = 0;
        queue<int> q;
        q.push(1);
        while (!q.empty())
        {
            int a = q.front();
            q.pop();
            for (auto &b : g[a])
            {
                if (cap[a][b] > 0 && level[b] == -1)
                {
                    level[b] = 1 + level[a];
                    q.push(b);
                }
            }
        }
        if (level[n] == -1)
        {
            break;
        }
        ans += dumb(1, (int) 1e9);
    }
    cout << ans << "\n";
}