Pagini recente » Cod sursa (job #2277253) | Cod sursa (job #1984530) | Cod sursa (job #1132871) | Rating Alexa Geo (Alexa_Geo) | Cod sursa (job #1990254)
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 5005,
M = 3e4 + 5;
struct Edg {
int v;
i64 c, f; };
int n, m, src, snk;
i64 flow;
vector<int> g[N];
Edg edgs[M * 2];
int lvl[N], gws[N], lst_edg[N];
bool bfs() {
static int it = 0; ++it;
deque<int> dq({src});
int u;
memset(lst_edg, 0x00, sizeof lst_edg);
gws[src] = it;
lvl[src] = 1;
while (!dq.empty()) {
u = dq.front();
dq.pop_front();
for (auto v: g[u]) if (gws[edgs[v].v] != it && edgs[v].c - edgs[v].f > 0) {
dq.push_back(edgs[v].v);
lvl[edgs[v].v] = lvl[u] + 1;
gws[edgs[v].v] = it; } }
return (gws[snk] == it); }
i64 dfs(int u, i64 mn) {
if (u == snk) return mn;
i64 pump, s(0);
int v;
for (; lst_edg[u] < g[u].size(); ++lst_edg[u]) {
v = g[u][lst_edg[u]];
if (lvl[u] + 1 == lvl[edgs[v].v] && edgs[v].c - edgs[v].f) {
pump = dfs(edgs[v].v, min(mn, edgs[v].c - edgs[v].f));
edgs[v].f+= pump;
edgs[v ^ 1].f-= pump;
mn-= pump;
s+= pump; } }
return s; }
void dinic() {
src = 1;
snk = n;
while (bfs())
flow+= dfs(src, 1e18); }
int main() {
#ifdef HOME
freopen("dat.in", "r", stdin);
freopen("dat.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int u, v, c, p(0);
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &u, &v, &c);
if (u != v) {
g[u].push_back(p++);
g[v].push_back(p++);
edgs[p - 2] = {v, c, 0};
edgs[p - 1] = {u, c, 0}; } }
dinic();
printf("%lld\n", flow);
return 0; }