Pagini recente » Cod sursa (job #2294489) | Istoria paginii utilizator/mihaela.catrina | Monitorul de evaluare | Cod sursa (job #2212974) | Cod sursa (job #1990255)
#include <bits/stdc++.h>
using namespace std;
const int N = 5005;
int n, m, src, snk, flow;
vector<int> g[N];
int cap[N][N], flw[N][N], lvl[N], lst[N];
bool bfs() {
deque<int> dq({src});
int u;
memset(lvl, 0x00, sizeof lvl);
memset(lst, 0x00, sizeof lst);
lvl[src] = 1;
while (!dq.empty()) {
u = dq.front();
dq.pop_front();
for (auto v: g[u]) if (!lvl[v] && cap[u][v] - flw[u][v] > 0) {
lvl[v] = lvl[u] + 1;
dq.push_back(v); } }
return lvl[snk]; }
int dfs(int u, int mn) {
if (u == snk) return mn;
int v, f, pump = 0;
for (; lst[u] < g[u].size(); ++lst[u]) {
v = g[u][lst[u]];
if (lvl[u] + 1 == lvl[v] && cap[u][v] - flw[u][v] > 0) {
f = dfs(v, min(mn, cap[u][v] - flw[u][v]));
flw[u][v]+= f;
flw[v][u]-= f;
pump+= f;
mn-= f; } }
return pump; }
int dinic() {
int flow = 0;
src = 1;
snk = n;
while (bfs())
flow+= dfs(src, 2e9);
return flow; }
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int u, v, c;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &u, &v, &c);
g[u].push_back(v); cap[u][v]+= c;
g[v].push_back(u); }
printf("%d\n", dinic());
return 0; }