Cod sursa(job #2662757)

Utilizator KPP17Popescu Paul KPP17 Data 24 octombrie 2020 13:57:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#define fisier "maxflow"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int _N = 1000, _M = 40*_N, N = _N + _M + 2, INF = 200;
#include <utility>
#define cap first
#define dir second
using _pair = std::pair<int, int>;
struct Arc;
#include <vector>
std::vector<Arc> L[N];
struct arcPtr: public _pair
{
    using _pair::pair;
    Arc& get() {return L[first][second];}
    operator bool () {return first != -1;}
} T[N] = {{-1, -1}};
struct Arc: public _pair
{
    using _pair::pair;
    arcPtr ptrOpus;
    Arc& opus() {return ptrOpus.get();}
};
void leaga(int a, int b, int c)
{
    L[a].push_back({c, b});
    L[b].push_back({0, a});
    L[a].back().ptrOpus = {b, L[b].size()-1};
    L[b].back().ptrOpus = {a, L[a].size()-1};
}
#include <bitset>
std::bitset<N> E;
#include <deque>
bool bfs(int dst)
{
    E = 1;
    for (std::deque<int> D = {0}; D.size(); D.pop_front())
        for (auto arc: L[D.front()])
            if (not E[arc.dir] and arc.cap)
            {
                D.push_back(arc.dir);
                E[arc.dir] = true;
                T[arc.dir] = arc.ptrOpus;
                if (arc.dir == dst)
                    return true;
            }
    return false;
}
void reduce(Arc& arc, int flux)
{
    arc.cap -= flux;
    arc.opus().cap += flux;
}
int main()
{
    int n, m, s, f = 0;
    in >> n >> m; s = --n;
    while (m--)
    {
        int a, b, c;
        in >> a >> b >> c;
        leaga(--a, --b, c);
    }
    while (bfs(s))
        for (arcPtr t = {s, 0}; t.second < L[s].size(); t.second++)
            if (E[t.get().dir])
            {
                auto min = t.get().opus();
                for (auto i = t; i; i = T[i.get().dir])
                    min = std::min(min, i.get().opus());
                f += min.cap;
                for (auto i = t; i; i = T[i.get().dir])
                    reduce(i.get().opus(), min.cap);
            }
    out << f;
}