Cod sursa(job #2696303)

Utilizator hirneagabrielHirnea Gabriel hirneagabriel Data 15 ianuarie 2021 17:58:11
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;


ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


#define NMax 10005
int n, m, x, y, C, capacitate[NMax][NMax], flx[NMax][NMax], flux, viz[NMax], t[NMax];
vector <int> G[NMax];
int bfs()
{
    for (int i = 0; i <= n; i++)
        viz[i] = 0;

    viz[1] = 1;

    queue <int> coada;
    int u;
    viz[1] = 1;
    coada.push(1);
    while (!coada.empty())
    {
        u = coada.front();
        coada.pop();
        for (int i = 0; i < G[u].size(); i++)
            if (!viz[G[u][i]] && capacitate[u][G[u][i]] != flx[u][G[u][i]])
            {
                viz[G[u][i]] = 1;
                if (G[u][i] != n)
                {
                    t[G[u][i]] = u;
                    coada.push(G[u][i]);
                }
            }
    }

    if (!viz[n])
        return 0;

    for (int i = 0; i < G[n].size(); i++)
    {
        t[n] = G[n][i];
        if (viz[t[n]] && capacitate[t[n]][n] != flx[t[n]][n])
        {
            int fmin = 1e9;
            for (u = n; u != 1; u = t[u])
                fmin = min(fmin, capacitate[t[u]][u] - flx[t[u]][u]);

            flux += fmin;

            for (u = n; u != 1; u = t[u])
            {
                flx[t[u]][u] += fmin;
                flx[u][t[u]] -= fmin;
            }
        }
    }

    return 1;
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        fin >> x >> y >> C;
        capacitate[x][y] = C;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    while (bfs());
    fout << flux;
    return 0;
}