Pagini recente » Cod sursa (job #2531926) | Cod sursa (job #2410319) | Borderou de evaluare (job #589025) | Cod sursa (job #12708) | Cod sursa (job #2697223)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int fl[1002][1002];
int cap[1002][1002];
vector<vector<int>> arcs;
vector<bool> viz;
vector<int> parents;
int n;
bool bfs() {
int current_node, next_node;
viz.assign(n + 2, 0);
queue<int> q;
q.push(1);
viz[1] = 1;
while (q.size()) {
current_node = q.front();
q.pop();
if (current_node != n)
for (int i = 0; i < arcs[current_node].size(); ++i) {
next_node = arcs[current_node][i];
if (fl[current_node][next_node] != cap[current_node][next_node] && !viz[next_node]) {
parents[next_node] = current_node;
viz[next_node] = true;
q.push(next_node);
}
}
}
return viz[n];
}
int main()
{
int m, a, b, c, flow = 0, flowmin;
f >> n >> m;
arcs.resize(n + 1);
parents.resize(n + 1, 0);
for (int i = 0; i < m; ++i) {
f >> a >> b >> c;
cap[a][b] += c;
arcs[a].push_back(b);
arcs[b].push_back(a);
}
while (bfs())
for (int j = 0; j < arcs[n].size(); ++j) {
a = arcs[n][j];
if (viz[a] && cap[a][n] != fl[a][n]) {
parents[n] = a;
flowmin = -1;
for (int i = n; i != 1; i = parents[i])
if (flowmin == -1 || flowmin > cap[parents[i]][i] - fl[parents[i]][i])
flowmin = cap[parents[i]][i] - fl[parents[i]][i];
if (flowmin > 0)
for (int i = n; i != 1; i = parents[i]) {
fl[parents[i]][i] += flowmin;
fl[i][parents[i]] -= flowmin;
}
flow += flowmin;
}
}
g << flow;
return 0;
}