Cod sursa(job #2329551)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 26 ianuarie 2019 22:13:32
Problema Hashuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

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

const int NMax = 1000, oo = 2e9;

vector <int> G[NMax + 5];

queue <int> Q;

int C[NMax + 5][NMax + 5], F[NMax + 5][NMax + 5], N, M, Sol, TT[NMax + 5];

bool Viz[NMax + 5];

void Read()
{
    fin >> N >> M;

    for(int i = 0, x, y, c; i < M; i++)
    {
        fin >> x >> y >> c;

        G[x].push_back(y);
        G[y].push_back(x);

        C[x][y] = c;
    }
}

bool BFS()
{
    memset(Viz, 0, sizeof(Viz));
    memset(TT, 0, sizeof(TT));

    Q.push(1), Viz[1] = true;

    while(!Q.empty())
    {
        int Nod = Q.front(); Q.pop();

        if(Nod == N) continue;

        for(auto Vecin : G[Nod])
        {
            if(Viz[Vecin] || C[Nod][Vecin] == F[Nod][Vecin]) continue;

            Q.push(Vecin), Viz[Vecin] = true, TT[Vecin] = Nod;
        }
    }
    return Viz[N];
}

void SolveP()
{
    while(BFS()) {
        for(auto Vecin : G[N])
        {
            if(F[Vecin][N] == C[Vecin][N] || !Viz[Vecin]) continue;

            int Fmin = oo; TT[N] = Vecin;

            for(int i = N; i != 1; i = TT[i])
                Fmin = min(Fmin, C[TT[i]][i] - F[TT[i]][i]);

            for(int i = N; i != 1; i = TT[i])
                F[TT[i]][i] += Fmin, F[i][TT[i]] -= Fmin;

            Sol += Fmin;
        }
    }
    fout << Sol << '\n';
}

int main()
{
    Read();
    SolveP();

    return 0;
}