Pagini recente » Cod sursa (job #1153076) | Cod sursa (job #2289208) | Cod sursa (job #9689) | Cod sursa (job #1190082) | Cod sursa (job #771503)
Cod sursa(job #771503)
#include <stdio.h>
#include <vector>
#include <queue>
#include <limits>
#include <cstring>
#define NMAX 1002
#define MMAX 5002
using namespace std;
vector<int> edg[NMAX];
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();
vector<int>::iterator it;
for (it = edg[el].begin(); it != edg[el].end(); it++) {
int next = *it;
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;
if (Capac[dest][parent[dest]] > 0) {
edg[dest].push_back(parent[dest]);
}
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);
edg[s].push_back(d);
Capac[s][d] = c;
}
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
read_();
EdmondsKarp();
/*
for (int i = 1; i <= n ; i++) {
for (int j = 2; j <= n; j++) {
int cr = Capac[i][j] - Flux[i][j];
printf("%d %d %d\n", i, j, cr);
}
printf("\n");
}*/
return 0;
}