Cod sursa(job #2416415)

Utilizator akaprosAna Kapros akapros Data 27 aprilie 2019 15:31:38
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>
#define maxN 1002
#define inf 0x3fffffff

using namespace std;

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

int n, m;
int S, D, C[maxN][maxN];
vector < int > V[maxN];

int F[maxN][maxN], par[maxN];
bool vis[maxN];

int ans;

bool bfs()
{
    queue < int > Q;
    //Q.clear();
    memset(vis, 0, sizeof(vis));
    Q.push(S);
    vis[S] = true;
    while (!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        for (int v : V[u]) if (C[u][v] != F[u][v] && !vis[v])
            {
                if (v == D) return true;
                vis[v] = true;
                par[v] = u;
                Q.push(v);
            }
    }
    return false;
}
void AddEdge(int u, int v, int c)
{
    V[u].push_back(v);
    V[v].push_back(u);
    C[u][v] += c;
}

int MaxFlow()
{
    int ans = 0;
    while (bfs())
    {
        for (int i = 0; i < D; ++ i)
            if (vis[i] && F[i][D] != C[i][D])
            {
                par[D] = i;
                int crtFlow = inf, nod = D;
                while (nod != S)
                {
                    crtFlow = min(crtFlow, -F[par[nod]][nod] + C[par[nod]][nod]);
                    nod = par[nod];
                }
                nod = D;
                while (nod != S)
                {
                    F[par[nod]][nod] += crtFlow;
                    F[nod][par[nod]] -= crtFlow;
                    nod = par[nod];
                }
                ans += crtFlow;
            }
    }
    return ans;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i)
    {
        int u, v, c;
        scanf("%d%d%d", &u, &v, &c);
        -- u;
        -- v;
        AddEdge(u, v, c);
    }
    S = 0;
    D = n - 1;

    printf("%d\n", MaxFlow());
    return 0;
}