Cod sursa(job #1985551)

Utilizator DenisacheDenis Ehorovici Denisache Data 28 mai 2017 02:22:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

#define NMAX 1005
vector <int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], TT[NMAX];
int n, m;
bool viz[NMAX];

int BFS() {
    queue <int> Q;
    Q.push(1);

    memset(viz, 0, sizeof(viz));
    viz[1] = true;

    while (!Q.empty()) {
        int nod = Q.front();
        Q.pop();
        if (nod == n) continue;
        for (int i = 0; i < G[nod].size(); i++) {
            int next = G[nod][i];
            if (F[nod][next] == C[nod][next] || viz[next]) continue;
            viz[next] = true;
            Q.push(next);
            TT[next] = nod;
        }
    }

    return viz[n];
}

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

    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b] = c;
    }

    int flow = 0;
    const int INF = (1 << 30);
    while (BFS()) {
        int fmin = INF;
        for (int i = 0; i < G[n].size(); i++) {
            int nod = G[n][i];
            if (F[nod][n] == C[nod][n] || !viz[nod]) continue;
            TT[n] = nod;

            fmin = INF;
            for (nod = n; nod != 1; nod = TT[nod]) {
                fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
            }

            for (nod = n; nod != 1; nod = TT[nod]) {
                F[TT[nod]][nod] += fmin;
                F[nod][TT[nod]] -= fmin;
            }

            flow += fmin;
        }
    }

    printf("%d", flow);
    return 0;
}