Cod sursa(job #1750812)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 31 august 2016 01:28:29
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1005,
           INF = 1e9;

int n, m;

int  cap[NMAX][NMAX],
     flx[NMAX][NMAX],
     pat[NMAX];
bool   f[NMAX];

vector<int> g[NMAX];

inline bool bfs(void) {
    queue<int> q;
    bool flag;
    int  u;

    memset(f, 0x00, sizeof(f));
    q.push(1);

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

        for(auto v:g[u]) {
            if(cap[u][v]-flx[u][v]>0 && !f[v]) {
                q.push(v);
                pat[v] = u;
                  f[v] = true;
            }
        }
    }

    return f[n];
}

int main(void) {
    freopen("maxflow.in",  "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int u, v, ant, fmin;

    ant = 0;

    scanf("%d%d", &n, &m);
    while(m--) {
        scanf("%d%d", &u, &v);
        scanf("%d", &cap[u][v]);
        g[u].push_back(v);
        g[v].push_back(u);
    }

    while(bfs()) {
    for(auto v:g[n]) {
        fmin   = INF;
        pat[n] = v;

        for(int i=n; i!=1; i=pat[i])
            fmin = min(fmin, cap[pat[i]][i] - flx[pat[i]][i]);

        if(fmin > 0) {
            for(int i=n; i!=1; i=pat[i]) {
                flx[pat[i]][i] += fmin;
                flx[i][pat[i]] -= fmin;
            }
            ant += fmin;
        }
    }}

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

    fclose(stdin);
    fclose(stdout);
    return 0;
}