Pagini recente » Cod sursa (job #603282) | Cod sursa (job #2567854) | Cod sursa (job #690829) | Istoria paginii runda/pregatire_arhiva_educationala/clasament | Cod sursa (job #2434362)
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
using namespace std;
struct MaxFlow {
int n, source, sink, flow;
vector<int> parent;
vector<vector<int>> adj, capacity;
MaxFlow(int n_, int source_, int sink_) :
n(n_), source(source_), sink(sink_), flow(0), parent(n), adj(n),
capacity(n, vector<int>(n)) {}
void AddEdge(int u, int v, int cap) {
adj[u].emplace_back(v);
adj[v].emplace_back(u);
capacity[u][v] += cap;
}
bool CanIncreaseFlow() {
fill(parent.begin(), parent.end(), -1);
parent[source] = -2;
vector<int> q = {source};
for (int i = 0; i < (int)q.size(); ++i) {
int node = q[i];
for (int &x : adj[node]) {
if (parent[x] == -1 && capacity[node][x]) {
parent[x] = node;
q.emplace_back(x);
}
}
}
return parent[sink] != -1;
}
int GetMaxFlow() {
while (CanIncreaseFlow()) {
for (int &x : adj[sink]) {
int add_flow = capacity[x][sink];
if (add_flow == 0 || parent[x] == -1) continue;
int node = x;
while (node != source) {
add_flow = min(add_flow, capacity[parent[node]][node]);
node = parent[node];
}
node = x;
while (node != source) {
capacity[parent[node]][node] -= add_flow;
capacity[node][parent[node]] += add_flow;
node = parent[node];
}
capacity[x][sink] -= add_flow;
capacity[sink][x] += add_flow;
flow += add_flow;
}
}
return flow;
}
};
int main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, m; cin >> n >> m;
MaxFlow g(n, 0, n - 1);
while (m--) {
int u, v, cap; cin >> u >> v >> cap; --u, --v;
g.AddEdge(u, v, cap);
}
cout << g.GetMaxFlow() << endl;
}