Pagini recente » Cod sursa (job #816939) | Cod sursa (job #422209) | Cod sursa (job #2695695) | Cod sursa (job #1896344) | Cod sursa (job #1810077)
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
#define NMAX 1010
#define INF (1<<30)
using namespace std;
vector<int> G[NMAX];
bool viz[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], T[NMAX];
int N, M, a, b, c, i, fmin, fmax;
int bfs(int start, int end) {
queue<int> Q;
Q.push(start);
memset(viz, false, sizeof(viz));
viz[start] = true;
int n = 0;
while (!Q.empty()) {
n = Q.front();
Q.pop();
if (n == end) {
continue;
}
for (vector<int>::iterator it = G[n].begin(); it != G[n].end(); it++) {
if (!viz[*it] && C[n][*it] > F[n][*it]) {
viz[*it] = true;
T[*it] = n;
Q.push(*it);
}
}
}
return viz[end];
}
int main(int argc, char **argv)
{
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;
}
while(bfs(1, N)) {
for (vector<int>::iterator it = G[N].begin(); it != G[N].end(); it++) {
if (viz[*it] && C[*it][N] > F[*it][N]) {
T[N] = *it;
fmin = INF;
for (int n = N; n != 1; n = T[n]) {
fmin = min(fmin, C[T[n]][n] - F[T[n]][n]);
}
fmax += fmin;
for (int n = N; n != 1; n = T[n]) {
F[T[n]][n] += fmin;
F[n][T[n]] -= fmin;
}
}
}
}
printf("%d\n", fmax);
return 0;
}