Pagini recente » Cod sursa (job #3039663) | Rezultatele filtrării | Cod sursa (job #3039609) | Rating Stefan Domunco (Stefan_Domunco) | Cod sursa (job #879560)
Cod sursa(job #879560)
#include <cstdio>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 1010;
int N, M;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N];
int tata[MAX_N], use[MAX_N];
vector <int> Q;
vector <int> G[MAX_N];
int bfs() {
memset(tata, 0, sizeof(tata));
memset(use, 0, sizeof(use));
Q.clear();
Q.push_back(1);
use[1] = 1;
for (;;) {
int DIM = Q.size();
int pos = rand() % DIM;
int nod = Q[pos];
swap(Q[pos], Q[DIM - 1]);
Q.pop_back();
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.push_back(*it);
}
if (use[N])
break;
if (Q.size() == 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;
}