Pagini recente » Cod sursa (job #928935) | Cod sursa (job #1029717) | Cod sursa (job #175383) | Cod sursa (job #2314829) | Cod sursa (job #2658014)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int cap[1003][1003];
int fl[1003][1003];
vector<vector<int>> arcs;
vector<bool> viz;
vector<int> parents;
int n;
bool bfs() {
queue<int> q;
viz.assign(n+2, false);
int current_node, next_node;
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] == false) {
q.push(next_node);
viz[next_node] = true;
parents[next_node] = current_node;
if (next_node == n)
return true;
}
}
}
return false;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int m, a, b, c, flow = 0, flowmin = 0;
scanf("%d%d", &n, &m);
arcs.resize(n+2);
parents.resize(n+2, 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()) {
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];
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;
}