Pagini recente » Cod sursa (job #543586) | Cod sursa (job #533985) | Cod sursa (job #78235) | Cod sursa (job #2053335) | Cod sursa (job #2619475)
#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int)(x).size()
#define pb push_back
struct Edge {
int v;
int flow, C;
int rev;
};
template<int SZ> struct Dinic {
int level[SZ], start[SZ];
vector<Edge> adj[SZ];
void addEdge(int u, int v, int C) {
Edge a{v, 0, C, sz(adj[v])};
Edge b{u, 0, 0, sz(adj[u])};
adj[u].pb(a), adj[v].pb(b);
}
bool bfs(int s, int t) {
for (int i = 0; i < SZ; i++) level[i] = -1;
level[s] = 0;
queue<int> q; q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (auto e: adj[u])
if (level[e.v] < 0 && e.flow < e.C) {
level[e.v] = level[u] + 1;
q.push(e.v);
}
}
return level[t] >= 0;
}
int sendFlow(int u, int flow, int t) {
if (u == t) return flow;
for ( ; start[u] < sz(adj[u]); start[u] ++) {
Edge &e = adj[u][start[u]];
if (level[e.v] == level[u]+1 && e.flow < e.C) {
int curr_flow = min(flow, e.C - e.flow);
int temp_flow = sendFlow(e.v, curr_flow, t);
if (temp_flow > 0) {
e.flow += temp_flow;
adj[e.v][e.rev].flow -= temp_flow;
return temp_flow;
}
}
}
return 0;
}
int maxFlow(int s, int t) {
if (s == t) return -1;
int total = 0;
while (bfs(s, t)) {
for (int i = 0; i < SZ; i++) start[i] = 0;
while (int flow = sendFlow(s, INT_MAX, t)) total += flow;
}
return total;
}
};
int main() {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
int n, k;
scanf("%d %d", &n, &k);
Dinic<1007> f;
while (k--) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
f.addEdge(a - 1, b - 1, c);
}
printf("%d\n", f.maxFlow(0, n - 1));
return 0;
}