Cod sursa(job #2661719)

Utilizator KPP17Popescu Paul KPP17 Data 22 octombrie 2020 16:43:15
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#define fisier "maxflow"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int N = 1000, INF = 110000;
int C[N][N], T[N], E[N], n;
#include <vector>
std::vector<int> L[N], S;
#include <deque>
bool bfs()
{
    *E = INF;
    for (std::deque<int> D = {0}; D.size(); D.pop_front())
        for (int back: L[D.front()])
            if (not E[back] and C[D.front()][back])
            {
                D.push_back(back);
                E[back] = std::min(E[D.front()], C[D.front()][back]);
                T[back] = D.front();
                if (back == n)
                    return true;
            }
    return false;
}
#include <algorithm>
int main()
{
    int m, f = 0;
    in >> n >> m;
    n--;
    while (m--)
    {
        int a, b, c;
        in >> a >> b >> c;
        C[--a][--b] = c;
        L[a].push_back(b);
        L[b].push_back(a);
        if (b == n)
            S.push_back(a);
    }
    while (bfs())
    {
        for (int t: S)
            if (E[t] and C[t][n])
            {
                f += m = std::min(C[t][n], E[t]);
                T[n] = t;
                for (int i = n; i; i = T[i])
                {
                    C[ T[i] ][i] -= m;
                    C[i][ T[i] ] += m;
                }
            }
        std::fill(E, E+n+1, 0);
    }
    out << f;
}