Pagini recente » Monitorul de evaluare | Rating Alex Imbrea (suprem) | Cod sursa (job #2110347) | Monitorul de evaluare | Cod sursa (job #1873190)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
const int NMAX = 1024,
INF = 0x3f3f3f3f;
int ant;
vector<int> g[NMAX];
int flow[NMAX][NMAX],
cap[NMAX][NMAX],
far[NMAX],
gws[NMAX];
bool pump(int src, int snk) {
static int it = 0; ++it;
deque<int> q;
int u, now, res;
gws[src] = it;
q.push_back(src);
while (!q.empty()) {
u = q.front();
q.pop_front();
for (auto v: g[u]) if (gws[v] != it && cap[u][v] - flow[u][v] > 0) {
q.push_back(v);
gws[v] = it;
far[v] = u; } }
if (gws[snk] < it)
return false;
for (auto lnk: g[snk]) if (cap[lnk][snk] - flow[lnk][snk] > 0) {
res = cap[lnk][snk] - flow[lnk][snk];
for (now = lnk; now != src; now = far[now])
res = min(res, cap[far[now]][now] - flow[far[now]][now]);
for (now = lnk; now != src; now = far[now]) {
flow[far[now]][now]+= res;
flow[now][far[now]]-= res; }
flow[lnk][snk]+= res;
flow[snk][lnk]-= res;
ant+= max(res, 0); }
return true; }
int main(void) {
int n, m, u, v, c;
fi >> n >> m;
for (int i = 0; i < m; ++i) {
fi >> u >> v >> c;
cap[u][v]+= c;
g[u].push_back(v);
g[v].push_back(u); }
while (pump(1, n));
fo << ant << '\n';
return 0; }