Pagini recente » Cod sursa (job #2425002) | Istoria paginii preoni-2007/clasament/runda-4/9 | Cod sursa (job #3150888) | Cod sursa (job #1253491) | Cod sursa (job #771504)
Cod sursa(job #771504)
#include <stdio.h>
#include <vector>
#include <queue>
#include <limits>
#include <cstring>
#define NMAX 1002
#define MMAX 5002
using namespace std;
int Capac[NMAX][NMAX];
int parent[NMAX];
int n;
bool bfs() {
queue<int> toBeProc;
memset(parent, 0, sizeof(parent));
toBeProc.push(1);
parent[1] = -1;
while (!toBeProc.empty()) {
int el = toBeProc.front();
toBeProc.pop();
for (int next = 2; next <= n; next++) {
if (parent[next] == 0 && Capac[el][next] > 0) {
parent[next] = el;
toBeProc.push(next);
if (next == n) {
break;
}
}
}
if (toBeProc.back() == n) {
break;
}
}
return (parent[n] != 0);
}
int get_min() {
int cf = std::numeric_limits<int>::max();
int dest = n;
while (parent[dest] != -1){
int cr = Capac[parent[dest]][dest];
if (cf > cr) {
cf = cr;
}
dest = parent[dest];
}
return cf;
}
void modify(int cf) {
int dest = n;
while (parent[dest] != -1){
Capac[parent[dest]][dest] -= cf;
Capac[dest][parent[dest]] += cf;
dest = parent[dest];
}
}
void EdmondsKarp() {
int cf;
int sum = 0;
while (bfs()) {
cf = get_min();
modify(cf);
sum += cf;
}
printf("%d", sum);
}
void read_() {
int m, s, d, c;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &s, &d, &c);
Capac[s][d] = c;
}
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
read_();
EdmondsKarp();
return 0;
}