Cod sursa(job #2641565)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 11 august 2020 23:24:53
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <deque>
#include <vector>
using namespace std;

const int DIM = 1005;
const int INF = 1000000005;

vector<int> edg[DIM];
int cap[DIM][DIM], ptr[DIM];
bool mrk[DIM];

bool bfs(int st, int en) {
    for (int i = st; i <= en; ++i) {
        ptr[i] = 0;
        mrk[i] = false;
    }
    deque<int> que;
    que.push_back(st); mrk[st] = true;
    for (; que.size(); que.pop_front()) {
        int x = que.front();
        for (int y : edg[x]) {
            if (!mrk[y] && cap[x][y] > 0) {
                mrk[y] = true;
                if (y != en)
                    que.push_back(y);
            }
        }
    }
    return mrk[en];
}

int dfs(int x, int en, int fl = INF) {
    if (!fl)
        return 0;
    if (x == en)
        return fl;
    for (; ptr[x] < edg[x].size() && fl; ++ptr[x]) {
        int y = edg[x][ptr[x]];
        if (!mrk[y] or cap[x][y] <= 0)
            continue;
        int nfl = dfs(y, en, min(fl, cap[x][y]));
        if (nfl > 0) {
            cap[x][y] -= nfl;
            cap[y][x] += nfl;
            return nfl;
        }
    }
    return 0;
}

int main(void) {
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        int x, y, c;
        cin >> x >> y >> c;
        edg[x].push_back(y); cap[x][y] = c;
        edg[y].push_back(x); cap[y][x] = 0;
    }
    int fl = 0;
    while (bfs(1, n)) {
        int nfl;
        while (nfl = dfs(1, n)) {
            fl += nfl;
        }
    }
    cout << fl << "\n";
    return 0;
}