Pagini recente » Profil Savu_Stefan_Catalin | Rezultatele filtrării | Registru diplome | Rezultatele filtrării | Cod sursa (job #879562)
Cod sursa(job #879562)
#include <cstdio>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 1010;
int N, M, K;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N];
int tata[MAX_N], use[MAX_N];
int Q[MAX_N];
vector <int> G[MAX_N];
int bfs() {
memset(tata, 0, sizeof(tata));
memset(use, 0, sizeof(use));
K = 1;
Q[K] = 1;
use[1] = 1;
for (;;) {
int pos = rand() % K + 1;
int nod = Q[pos];
swap(Q[pos], Q[K]);
Q[K--] = 0;
for (vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
if (use[*it] == 0 && C[nod][*it] - F[nod][*it] > 0) {
tata[*it] = nod;
use[*it] = 1;
Q[++K] = *it;
}
if (use[N])
break;
if (K == 0)
break;
}
int vmin = 1e+9;
for (int i = N; tata[i] > 0; i = tata[i])
vmin = min(vmin, C[tata[i]][i] - F[tata[i]][i]);
if (vmin == 1e+9)
vmin = 0;
for (int i = N; tata[i] > 0; i = tata[i]) {
F[tata[i]][i] += vmin;
F[i][tata[i]] -= vmin;
}
return vmin;
}
int main() {
srand(time(NULL));
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= M; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
G[a].push_back(b);
G[b].push_back(a);
C[a][b] = c;
}
int flow = 0;
for (;;) {
int add = bfs();
if (add == 0)
break;
else
flow += add;
}
printf("%d\n", flow);
return 0;
}