Cod sursa(job #2660199)

Utilizator KPP17Popescu Paul KPP17 Data 18 octombrie 2020 15:08:04
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#define fisier "maxflow"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int N = 1001;
#include <utility>
using _Arc = std::pair<int, int>;
class Arc;
#include <vector>
std::vector<Arc> L[N];
struct ArcPtr: public _Arc
{
    using _Arc::pair;
    Arc& get() {return L[first][second];}
    operator bool () {return first or second;}
} T[N];
struct Arc: public _Arc
{
    using _Arc::pair;
    ArcPtr ptrOpus;
    Arc& opus() {return ptrOpus.get();}
};
#include <deque>
bool bfs(const int n)
{
    bool E[N] = {false, true};
    for (std::deque<int> deq = {1}; deq.size(); deq.pop_front())
        for (Arc arc: L[deq.front()])
            if (!E[arc.second] && arc.first)
            {
                E[arc.second] = true;
                deq.push_back(arc.second);
                T[arc.second] = arc.ptrOpus;
                if (arc.second == n)
                    return true;
            }
    return false;
}

int main()

{
    int n, m, f = 0;
    in >> n >> m;
    while (m--)
    {
        int a, b, c;
        in >> a >> b >> c;
        L[a].push_back({c, b});
        L[b].push_back({0, a});
        //L[a].back().opus = &L[b].back();
        //L[b].back().opus = &L[a].back();
        // ^ Codul de sus este toxic deoarece zonele de memorie ale vectorului se pot schimba.
        L[a].back().ptrOpus = {b, L[b].size() - 1};
        L[b].back().ptrOpus = {a, L[a].size() - 1};
    }
    while (bfs(n))
    {
        m = T[n].get().opus().first;
        for (int i = n; T[i]; i = T[i].get().second)
            m = std::min(m, T[i].get().opus().first);
        f += m;
        for (int i = n; T[i]; i = T[i].get().second)
        {
            T[i].get().opus().first -= m;
            T[i].get()       .first += m;
        }
    }
    out << f;
}