Cod sursa(job #880323)
#include <vector>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <ctime>
using namespace std;
#define MAXN 1001
#define INF 0x3f3f3f3f
int N, M, flux[MAXN][MAXN], dad[MAXN];
vector<int> graph[MAXN];
bool DFS() {
int coada[MAXN];
coada[0] = 1; coada[1] = 1;
while (coada[0]) {
int poz = (rand() % coada[0]) + 1;
int nod = coada[poz];
coada[poz] = coada[coada[0]--];
if (nod == N)
return 1;
for (int i = 0; i < graph[nod].size(); ++i) {
int node = graph[nod][i];
if (!dad[node] && flux[nod][node]) {
dad[node] = nod;
coada[++coada[0]] = node;
}
}
}
return 0;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
srand(time(NULL));
for (int i = 1; i <= M; ++i) {
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
graph[x].push_back(y); graph[y].push_back(x);
flux[x][y] = c;
}
int maxflow = 0;
while (DFS()) {
int minim = INF;
for (int nod = N; nod != 1; nod = dad[nod])
minim = min (minim, flux[dad[nod]][nod]);
maxflow += minim;
for (int nod = N; nod != 1; nod = dad[nod]) {
flux[dad[nod]][nod] -= minim;
flux[nod][dad[nod]] += minim;
}
memset(dad, 0, sizeof(dad));
}
printf("%d\n", maxflow);
return 0;
}