Pagini recente » Cod sursa (job #287811) | Cod sursa (job #1907500) | Cod sursa (job #2485143) | Cod sursa (job #1204151) | Cod sursa (job #629813)
Cod sursa(job #629813)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxN = 1010;
const int inf = 0x3f3f3f3f;
int N, M, maxflow;
int up[maxN], flow[maxN];
int C[maxN][maxN];
vector <int> G[maxN];
int Q[maxN];
bool ok;
inline void init() {
memset(up, -1, sizeof(up));
memset(flow, 0, sizeof(flow));
flow[1] = inf;
}
inline int bfs() {
int p, u, nod, fiu, i;
p = u = 1;
Q[1] = 1;
while (p <= u) {
nod = Q[p];
for (i = 0; i < G[nod].size(); i++) {
fiu = G[nod][i];
if (flow[fiu] == 0 && C[nod][fiu]) {
flow[fiu] = min(C[nod][fiu], flow[nod]);
up[fiu] = nod;
// fprintf(stderr, "%d %d\n", nod, fiu);
Q[++u] = fiu;
}
//fprintf(stderr, "\n");
/* if (fiu == N) {
p = u + 1;
break;
}*/
}
++p;
}
// fprintf(stderr, "%d\n", flow[N]);
if (flow[N] == 0) {
ok = 0;
return 0;
}
ok = 1;
int flux = flow[N];
for (i = N; i != 1; i = up[i]) {
C[i][up[i]] += flux;
C[up[i]][i] -= flux;
}
return flux;
}
int main() {
int i, a, b, c;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= M; i++) {
scanf("%d%d%d", &a, &b, &c);
G[a].push_back(b);
G[b].push_back(a);
C[a][b] = c;
C[b][a] = 0;
}
ok = 1;
while (ok) {
init();
ok = 0;
// fprintf(stderr, "sula\n");
maxflow += bfs();
}
printf("%d\n", maxflow);
return 0;
}