Pagini recente » Cod sursa (job #1721248) | Cod sursa (job #1186775) | Cod sursa (job #2905263) | Cod sursa (job #519033) | Cod sursa (job #1239434)
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int flux,x,y,z,M,N,rez,c[1100][1100],f[1100][1100],q[1100],first,last,p[1100];
vector<int> m[1100];
bool viz[1100];
inline void add(int x) {
q[last] = x;
++last;
}
inline void clear() {
first = 0, last = 0;
}
inline int size() {
return last - first;
}
inline int pop() {
int x = q[first];
++first;
return x;
}
inline void reset_stuff() {
clear();
flux = 110000;
for(int i = 1; i <= N; ++i) {
viz[i] = 0;
p[i] = 0;
}
}
inline bool bfs() {
bool ret = false;
reset_stuff();
add(1);
viz[1] = 1;
while(size()) {
int x = pop();
for(int i = 0; i < m[x].size(); ++i) {
int y = m[x][i];
if(!viz[y] && f[x][y] < c[x][y]) {
add(y);
viz[y]=1;
p[y] = x;
if(y==N) {
ret = true;
break;
}
}
}
if(ret) {
break;
}
}
if(ret) {
int curr = N;
while(p[curr]) {
if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
flux = c[p[curr]][curr] - f[p[curr]][curr];
}
if(!flux) {
break;
}
curr = p[curr];
}
if(!flux) {
return false;
}
curr = N;
while(p[curr]) {
f[p[curr]][curr] += flux;
f[curr][p[curr]] -= flux;
curr = p[curr];
}
}
return ret;
}
int main() {
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);
m[x].push_back(y);
m[y].push_back(x);
c[x][y] = z;
}
while(true) {
if(!bfs()) {
break;
}
rez += flux;
}
printf("%d",rez);
return 0;
}