Pagini recente » Profil Andrei_Cotor | Cod sursa (job #2488992) | Cod sursa (job #2988064) | Cod sursa (job #206971) | Cod sursa (job #2454553)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
struct Edge {
int v, cap, next; };
vector<Edge> edgs;
vector<int> at, adj, dist;
int n, m, src, snk;
static bool bfs() {
deque<int> dq;
int u;
fill(begin(dist), end(dist), -1);
at = adj;
dq.push_back(src);
dist[src] = 0;
while (!dq.empty()) {
u = dq.front();
dq.pop_front();
for (; at[u] != -1; at[u] = edgs[at[u]].next) {
int v = edgs[at[u]].v;
if (dist[v] != -1 || edgs[at[u]].cap == 0)
continue;
dist[v] = dist[u] + 1;
dq.push_back(v); } }
return dist[snk] != -1; }
static int dfs(int u, int bnd = 2e9) {
if (u == snk)
return bnd;
int flw = 0;
for (; at[u] != -1 && bnd > 0; at[u] = edgs[at[u]].next) {
int augm, e = at[u], v = edgs[at[u]].v;
if (edgs[at[u]].cap > 0 && dist[v] == dist[u] + 1 && (augm = dfs(v, min(bnd, edgs[at[u]].cap))) > 0) {
augm = min(augm, bnd);
edgs[at[u]].cap-= augm;
edgs[at[u] ^ 1].cap+= augm;
flw+= augm;
bnd-= augm; } }
return flw; }
static int get_flow() {
int t, ant = 0;
while (bfs()) {
at = adj;
while (t = dfs(src))
ant+= t; }
return ant; }
int main() {
fi >> n >> m;
src = 1, snk = n;
adj = at = dist = vector<int>(n + 1, -1);
for (int u, v, c, i = 0; i < m; ++i) {
fi >> u >> v >> c;
edgs.push_back({v, c, adj[u]});
adj[u] = edgs.size() - 1;
edgs.push_back({u, 0, adj[v]});
adj[v] = edgs.size() - 1; }
fo << get_flow() << endl;
return 0; }