Pagini recente » Cod sursa (job #2900063) | Cod sursa (job #1913755) | Cod sursa (job #2773755) | Cod sursa (job #2727877) | Cod sursa (job #2568701)
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
ifstream inf("maxflow.in");
ofstream outf("maxflow.out");
const int NMAX = 1000;
vector<int> ad[NMAX];
int cap[NMAX][NMAX];
int flow[NMAX][NMAX];
int lvl[NMAX];
int n;
bool BFS(int d) {
int x;
queue<int> q;
q.push(0);
memset(lvl, 0xff, sizeof(lvl));
lvl[0] = 0;
while(!q.empty()) {
x = q.front();
q.pop();
for(int el : ad[x]) {
if(lvl[el] < 0 && cap[x][el] > flow[x][el]) {
lvl[el] = lvl[x] + 1;
q.push(el);
}
}
}
return lvl[d] != -1;
}
int DFS(int x, int flux) {
if(x == n - 1) {
return flux;
}
for(int el : ad[x]) {
if(lvl[el] == lvl[x] + 1 && flow[x][el] < cap[x][el]) {
int fmin = DFS(el, min(cap[x][el] - flow[x][el], flux));
if(fmin > 0) {
flow[x][el] += fmin;
flow[el][x] -= fmin;
return fmin;
}
}
}
return 0;
}
int main() {
int m, x, y, c;
inf >> n >> m;
for(int i = 0; i < m; i++) {
inf >> x >> y >> c;
x--;
y--;
if(!cap[x][y] && !cap[y][x]) {
ad[x].push_back(y);
ad[y].push_back(x);
}
cap[x][y] += c;
}
int ftot = 0;
while(BFS(n - 1)) {
while(int flux = DFS(0, 0x3f3f3f3f)) {
ftot += flux;
}
}
outf << ftot;
return 0;
}