Pagini recente » Cod sursa (job #1661619) | Rating Vilvoiu Vasile Cornel (vasy) | Registru diplome | Statisticile problemei Regine | Cod sursa (job #879554)
Cod sursa(job #879554)
#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> current, next;
vector <int> G[MAX_N];
int bfs() {
memset(tata, 0, sizeof(tata));
memset(use, 0, sizeof(use));
current.clear();
current.push_back(1);
use[1] = 1;
for (;;) {
next.clear();
for (vector<int>::iterator it = current.begin(); it != current.end(); ++it) {
int nod = *it;
for (vector <int>::iterator v = G[nod].begin(); v != G[nod].end(); ++v)
if (use[*v] == 0 && C[nod][*v] - F[nod][*v] > 0) {
next.push_back(*v);
tata[*v] = nod;
use[*v] = 1;
}
}
random_shuffle(next.begin(), next.end());
next.swap(current);
next.clear();
if (use[N])
break;
if (current.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;
}