Cod sursa(job #2641572)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 11 august 2020 23:41:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 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], dis[DIM];

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

int dfs(int x, int en, int fl = INF) {
    if (!fl)
        return 0;
    if (x == en)
        return fl;
    for (; ptr[x] < edg[x].size(); ++ptr[x]) {
        int y = edg[x][ptr[x]];
        if (dis[y] != dis[x] + 1 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);
    }
    int fl = 0;
    while (bfs(1, n)) {
        int nfl;
        while (nfl = dfs(1, n)) {
            fl += nfl;
        }
    }
    cout << fl << "\n";
    return 0;
}