Pagini recente » Cod sursa (job #73232) | Cod sursa (job #581690) | Cod sursa (job #1773069) | Cod sursa (job #2298949) | Cod sursa (job #1222856)
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 1010
#define INF 0xFFFFFF
vector<int> Graph[MAX];
queue<int> Q;
bool Use[MAX];
int N, M, Capacity[MAX][MAX], From[MAX], Flow[MAX][MAX], MaxFlow;
bool Bfs() {
int X, Y;
memset(Use, 0, sizeof(Use));
Q.push(1);
Use[1] = 1;
while (Q.size()) {
X = Q.front();
Q.pop();
if (X == N) continue;
for (int i = 0; i < Graph[X].size(); i++){
Y = Graph[X][i];
if (!Use[Y] && Capacity[X][Y] > Flow[X][Y]) {
Use[Y] = 1;
From[Y] = X;
Q.push(Y);
}
}
}
return Use[N];
}
int main() {
int X, Y, Z;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= M; i++) {
scanf("%d %d %d", &X, &Y, &Z);
Graph[X].push_back(Y);
Graph[Y].push_back(X);
Capacity[X][Y] = Z;
}
while (Bfs()) {
for (int i = 0; i < Graph[N].size(); i++) {
Y = Graph[N][i];
if (Use[Y] && Capacity[Y][N] > Flow[Y][N]) {
From[N] = Y;
Z = INF;
for (X = N; X != 1; X = From[X]) {
Z = min(Z, Capacity[From[X]][X] - Flow[From[X]][X]);
}
if (Z != INF && Z > 0) {
MaxFlow += Z;
for (X = N; X != 1; X = From[X]) {
Flow[From[X]][X] += Z;
Flow[X][From[X]] -= Z;
}
}
}
}
}
printf("%d\n", MaxFlow);
return 0;
}