Cod sursa(job #2699505)

Utilizator FlorinV13Florin Vasiliu FlorinV13 Data 24 ianuarie 2021 18:33:02
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>
#include <queue>
#define N   1001
#define INF 1000000000

using namespace std;

vector<int> ad[N];
int c[N][N], f[N][N], t[N], viz[N];

void citire(int &n, int &m)
{
    int i, x, y, cp;

    scanf("%d %d", &n, &m);
    for (i = 0; i < m; i++) {
        scanf("%d %d %d", &x, &y, &cp);
        ad[x].push_back(y);
        ad[y].push_back(x);
        c[x][y] = cp;
    }
}

int bfs(int n)
{
    queue<int> q;
    int u, v, i;

    for (i = 1; i <= n; i++)
        viz[i] = 0;

    q.push(1), viz[1] = 1;

    while (!q.empty()) {
        u = q.front();
        q.pop();

        for (i = 0; i < ad[u].size(); i++) {
            v = ad[u][i];

            if (c[u][v] == f[u][v] || viz[v])
                continue;

            q.push(v), viz[v] = 1;
            t[v] = u;

            if (v == n)
                return 1;
        }
    }
    return 0;
}

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

    int n, m, flux, fmin, i;

    citire(n, m);

    flux = 0;

    while (bfs(n)) {
        fmin = INF;
        for (i = n; i != 1; i = t[i])
            fmin = min(fmin, c[t[i]][i] - f[t[i]][i]);
        for (i = n; i != 1; i = t[i]) {
            f[t[i]][i] += fmin;
            f[i][t[i]] -= fmin;
        }
        flux += fmin;
    }

    printf("%d\n", flux);

    return 0;
}