Pagini recente » Cod sursa (job #2935274) | Cod sursa (job #288605) | Cod sursa (job #613108) | Cod sursa (job #1360823) | Cod sursa (job #2658707)
#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;
gasit |= dir.second == dest;
}
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;
}