Pagini recente » Cod sursa (job #354456) | Cod sursa (job #2343987) | Cod sursa (job #42211) | Cod sursa (job #3257942) | Cod sursa (job #2658020)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
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();
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() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int m, a, b, c, flow = 0, flowmin;
scanf("%d%d", &n, &m);
arcs.resize(n+1);
parents.resize(n+1, 0);
for(int i=0; i<m; ++i) {
scanf("%d%d%d", &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;
}
}
printf("%d\n", flow);
return 0;
}