Pagini recente » Cod sursa (job #2556922) | Cod sursa (job #3284605) | Cod sursa (job #3162577) | Cod sursa (job #2556910) | Cod sursa (job #1789713)
#include <stdio.h>
#include <vector>
#include <queue>
#define maxdim 1005
using namespace std;
int n, m;
int cp[maxdim][maxdim], f[maxdim][maxdim];
int viz[maxdim], T[maxdim];
vector<int> G[maxdim];
int bfs() {
for (int i = 1; i <= n; ++i) {
viz[i] = 0;
T[i] = 0;
}
queue<int> q;
q.push(1);
viz[1] = 1;
int ok = 0;
while (!q.empty()) {
int nod = q.front(); q.pop();
for (int vecin : G[nod]) {
if (cp[nod][vecin] > f[nod][vecin] && !viz[vecin]) {
if (vecin == n) {
ok = 1;
continue;
}
viz[vecin] = 1;
T[vecin] = nod;
q.push(vecin);
}
}
}
return ok;
}
int maxflow() {
int sol = 0;
while (bfs()) {
for (int prev : G[n]) {
T[n] = prev;
int nod;
int crt_flow = (1 << 29);
for (nod = n; nod != 1 && nod != 0; nod = T[nod]) {
crt_flow = min(crt_flow, cp[T[nod]][nod] - f[T[nod]][nod]);
}
if (nod != 1) {
continue;
}
for (nod = n; nod != 1; nod = T[nod]) {
f[T[nod]][nod] += crt_flow;
f[nod][T[nod]] -= crt_flow;
}
sol += crt_flow;
}
}
return sol;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++i) {
int x, y, c; scanf("%d %d %d", &x, &y, &c);
cp[x][y] = c;
G[x].push_back(y);
G[y].push_back(x);
}
printf("%d\n", maxflow());
return 0;
}