Pagini recente » Cod sursa (job #413337) | Cod sursa (job #1000902) | Cod sursa (job #2952622) | Cod sursa (job #2559108) | Cod sursa (job #2660199)
#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;
}