Cod sursa(job #1824702)

Utilizator akaprosAna Kapros akapros Data 8 decembrie 2016 12:07:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 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 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);
        r[x][y] = z;
    }
    S = 1;
    D = n;
}

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


void solve()
{
    ans = 0;
    bool continua = true;
    while (continua)
    {
        BFS(S, D);
        continua = false;
        for(int u = 1; u < n; u++)
            if (r[u][D] > 0 && deUnde[u] != 0)
            {
                continua = true;
                deUnde[D] = u;
                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)
                {
                    r[deUnde[nod]][nod] -= cap;
                    r[nod][deUnde[nod]] += cap;
                    nod = deUnde[nod];
                }
            }
    }
}

void write()
{
    /*
    for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= n; ++ j)
    	printf("%2d ", r[i][j]);
    printf("\n");
    }//*/
    printf("%d\n", ans);
}

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