Pagini recente » Cod sursa (job #2779803) | Cod sursa (job #2627184) | Cod sursa (job #2738821) | Cod sursa (job #2857606) | Cod sursa (job #2647570)
// optimizare - 100 pct
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1025;
const int INF = 0x3f3f3f3f;
int C[NMAX][NMAX], F[NMAX][NMAX], TT[NMAX];
int N, M, cd[NMAX], viz[NMAX];
vector<int> G[NMAX];
int BFS () {
cd[0] = cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i = 1; i <= cd[0]; i++) {
int nod = cd[i];
if (nod == N)
continue;
for (int j = 0; j < (int)G[nod].size(); j++) {
int V = G[nod][j];
if (C[nod][V] == F[nod][V] || viz[V])
continue;
viz[V] = 1;
cd[++cd[0]] = V;
TT[V] = nod;
}
}
return viz[N];
}
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, z;
scanf("%d%d%d", &x, &y, &z);
C[x][y] += z;
G[x].push_back(y);
G[y].push_back(x);
}
int flow = 0;
for (; BFS(); )
for (int i = 0; i < (int)G[N].size(); i++) {
int nod = G[N][i];
if (F[nod][N] == C[nod][N] || !viz[nod])
continue;
TT[N] = nod;
int fmin = INF;
for (nod = N; nod != 1; nod = TT[nod])
fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
if (fmin == 0)
continue;
for (nod = N; nod != 1; nod = TT[nod]) {
F[TT[nod]][nod] += fmin;
F[nod][TT[nod]] -= fmin;
}
flow += fmin;
}
printf("%d", flow);
return 0;
}