Pagini recente » Cod sursa (job #2045396) | Cod sursa (job #876987) | Istoria paginii runda/siht-hpeapns | Cod sursa (job #1990261) | Cod sursa (job #2012060)
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
#include <cstring>
const int MAX_N = 1000;
int cr[5 + MAX_N][5 + MAX_N];
std::vector<int> g[5 + MAX_N];
bool viz[5 + MAX_N];
int from[5 + MAX_N];
bool bfs(int s, int d) {
memset(viz, 0, sizeof(viz));
std::queue<int> q;
q.push(s);
viz[s] = true;
from[s] = s;
while (!q.empty() && !viz[d]) {
int u = q.front();
q.pop();
for (auto v : g[u]) {
if (!viz[v] && cr[u][v] > 0) {
q.push(v);
viz[v] = true;
from[v] = u;
}
}
}
return viz[d];
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; ++i) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if (cr[x][y] == 0) {
g[x].push_back(y);
g[y].push_back(x);
}
cr[x][y] = z;
}
int s, d;
s = 1;
d = N;
int ans = 0;
while (bfs(s, d)) {
int flux = INT_MAX;
int u = d;
while (u != s) {
flux = std::min(flux, cr[from[u]][u]);
u = from[u];
}
u = d;
while (u != s) {
cr[from[u]][u] -= flux;
cr[u][from[u]] += flux;
u = from[u];
}
ans += flux;
}
printf("%d\n", ans);
return 0;
}