Cod sursa(job #2658727)

Utilizator KPP17Popescu Paul KPP17 Data 14 octombrie 2020 21:12:26
Problema Flux maxim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb

#define fisier "maxflow"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");

const int N = 1000;
#include <vector>
#include <utility>
using _Arc = std::pair<int, int>;
struct Arc: public _Arc
{using _Arc::pair; Arc* opus; bool holo = false;};

std::vector<Arc> deLa[N];
std::vector<Arc*> drum;

#include <deque>
bool bfs(int dest)
{
    static int tata[N];
    static Arc* arcCatre[N];
    std::vector<bool> exp(N, false);
    bool gasit = false;
    for (std::deque<int> deq = {0}; deq.size(); deq.pop_front())
        for (auto& dir: deLa[deq.front()])
            if (dir.first && !exp[dir.second])
            {
                deq.push_back(dir.second);
                tata[dir.second] = deq.front();
                arcCatre[dir.second] = &dir;
                exp[dir.second] = true;
                if (dir.second == dest)
                    gasit = true;
            }
    if (!gasit)
        return false;
    do
        drum.push_back(arcCatre[dest]);
    while (dest = tata[dest]);
    return true;
}
int main()
{
    int n, m, flux = 0;
    in >> n >> m;
    while (m--)
    {
        int a, b, c;
        in >> a >> b >> c;
        deLa[--a].push_back({c, --b});
        deLa[b].push_back({0, a});
        deLa[b].back().holo = true;
        deLa[a].back().opus = &deLa[b].back();
        deLa[b].back().opus = &deLa[a].back();
    }
    while (bfs(n - 1))
    {
        int capMin = drum.front()->first;
        for (Arc* arc: drum)
            capMin = std::min(capMin, arc->first);
        flux += capMin;
        for (Arc* arc: drum)
        {
            arc->first -= capMin;
            arc->opus->first += capMin;
        }
        drum.clear();
    }
    out << flux;
}