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