Pagini recente » Cod sursa (job #2668217) | Cod sursa (job #1599687) | Cod sursa (job #2127567) | Cod sursa (job #3280465) | Cod sursa (job #2669823)
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> g, capacity, flow;
vector<bool> seen;
vector<int> dad;
int n;
bool bfs() {
for (int i = 0; i < n; ++i) {
seen[i] = false;
dad[i] = -1;
}
queue<int> q;
seen[0] = true;
q.push(0);
while ((int)q.size() > 0) {
int u = q.front();
q.pop();
if (u + 1 == n) {
continue;
}
for (int v : g[u]) {
if (seen[v] == true || capacity[u][v] == flow[u][v]) {
continue;
}
q.push(v);
seen[v] = true;
dad[v] = u;
}
}
return seen[n - 1];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
ifstream in("maxflow.in"); ofstream out("maxflow.out");
int m; in >> n >> m;
g.resize(n);
capacity.resize(n, vector<int>(n, 0));
flow.resize(n, vector<int>(n, 0));
seen.resize(n, false);
dad.resize(n, -1);
for (int i = 0; i < m; ++i) {
int u, v, c; in >> u >> v >> c;
u -= 1;
v -= 1;
capacity[u][v] += c;
g[u].push_back(v);
g[v].push_back(u);
}
int max_flow = 0;
while (bfs() == true) {
for (int v : g[n - 1]) {
if (v == n - 1 || seen[v] == false || capacity[v][n - 1] == flow[v][n - 1]) {
continue;
}
dad[n - 1] = v;
int min_flow = INT_MAX;
for (int node = n - 1; node != 0; node = dad[node]) {
min_flow = min(min_flow, capacity[dad[node]][node] - flow[dad[node]][node]);
}
for (int node = n - 1; node != 0; node = dad[node]) {
flow[dad[node]][node] += min_flow;
flow[node][dad[node]] -= min_flow;
}
max_flow += min_flow;
}
}
out << max_flow << "\n";
return 0;
}