Cod sursa(job #1824687)

Utilizator akaprosAna Kapros akapros Data 8 decembrie 2016 11:35:07
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>


#define Nmax 1001
#define inf 0x7fffffff


using namespace std;

FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);

int n, m;
int S, D, ans;
int c[Nmax][Nmax], f[Nmax][Nmax], r[Nmax][Nmax];
int deUnde[Nmax];
queue < int > Q;


void read()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++ i)
    {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        c[x][y] = r[x][y] = z;
    }
    S = 1;
    D = n;
}


bool BFS(int S, int D)
{
    memset(deUnde, 0, sizeof(deUnde));
    Q.push(S);
    deUnde[S] = S;
    while (!Q.empty())
    {
        int x = Q.front(), i;
        Q.pop();
        for (i = 1; i <= n; ++ i)
            if (r[x][i] > 0 && deUnde[i] == 0)
            {
                deUnde[i] = x;
                Q.push(i);
            }
    }
    return deUnde[D];
}


void solve()
{
    ans = 0;
    while (BFS(S, D))
    {
        int nod = D, cap = inf;
        while (nod != S)
        {
            cap = min(cap, r[deUnde[nod]][nod]);
            nod = deUnde[nod];
        }
        nod = D;
        ans += cap;
        while (nod != S)
        {
            f[deUnde[nod]][nod] += cap;
            f[nod][deUnde[nod]] -= cap;
            r[deUnde[nod]][nod] -= cap;
            r[nod][deUnde[nod]] += cap;
            nod = deUnde[nod];
        }
    }
}
void write()
{
    printf("%d\n", ans);
}


int main()
{
    read();
    solve();
    write();
    return 0;
}