Pagini recente » Cod sursa (job #295107) | Cod sursa (job #436137) | Cod sursa (job #2433912)
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
using namespace std;
bool CanIncreaseFlow(int source, int sink, vector<int> &parent,
vector<vector<int>> &adj, vector<vector<int>> &flow,
vector<vector<int>> &capacity) {
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] - flow[node][x] > 0) {
parent[x] = node;
q.emplace_back(x);
}
}
}
return parent[sink] != -1;
}
int main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, m; cin >> n >> m;
vector<vector<int>> adj(n);
vector<vector<int>> flow(n, vector<int>(n));
vector<vector<int>> capacity(n, vector<int>(n));
while (m--) {
int u, v, cap; cin >> u >> v >> cap; --u, --v;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
capacity[u][v] += cap;
}
const int source = 0;
const int sink = n - 1;
int max_flow = 0;
vector<int> parent(n);
while (CanIncreaseFlow(source, sink, parent, adj, flow, capacity)) {
for (int &x : adj[sink]) {
int vertex = x, added_flow = capacity[x][sink] - flow[x][sink];
if (added_flow > 0) {
while (vertex != source) {
added_flow = min(added_flow,
capacity[parent[vertex]][vertex] - flow[parent[vertex]][vertex]);
vertex = parent[vertex];
}
flow[x][sink] += added_flow;
max_flow += added_flow;
vertex = x;
while (vertex != source) {
flow[parent[vertex]][vertex] += added_flow;
vertex = parent[vertex];
}
}
}
}
cout << max_flow << endl;
}