Pagini recente » Cod sursa (job #2576575) | Cod sursa (job #2830660) | Cod sursa (job #2074594) | Cod sursa (job #2471456) | Cod sursa (job #456150)
Cod sursa(job #456150)
#include <cstdio>
#include <cstring>
#include <vector>
#define maxN 1010
#define maxM 5010
#define inf 0x3f3f3f3f
using namespace std;
vector <int> G[maxN];
int N, M;
int C[maxN][maxN], S, D;
int flux[maxN], up[maxN];
int a, b, c;
int totalFlow, ok;
void init() {
memset(up, -1, sizeof(up));
memset(flux, 0, sizeof(flux));
flux[S] = inf;
}
void bfs(int S) {
int Q[maxN], p, u, nod, fiu;
p = u = 1;
Q[1] = S;
while (p <= u) {
nod = Q[p];
for (int i = 0; i < G[nod].size(); i++) {
fiu = G[nod][i];
if (flux[fiu] == 0 && C[nod][fiu]) {
flux[fiu] = min(flux[nod], C[nod][fiu]);
up[fiu] = nod;
Q[++u] = fiu;
if (fiu == D) {
p = u + 1;
break;
}
}
}
p++;
}
if (flux[D] == 0) {
ok = 0;
return;
}
ok = 1;
totalFlow += flux[D];
for (int i = D; i != S; i = up[i]) {
C[up[i]][i] -= flux[D];
C[i][up[i]] += flux[D];
}
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; i++) {
scanf("%d%d%d", &a, &b, &c);
G[a].push_back(b);
C[a][b] = c;
}
S = 1; D = N; ok = 1;
while (ok) {
ok = 0;
init();
bfs(S);
}
printf("%d\n", totalFlow);
return 0;
}