Pagini recente » Cod sursa (job #2810460) | Rating Covor Sorin (sorincovor) | Cod sursa (job #1937639) | Cod sursa (job #2784216) | Cod sursa (job #2697699)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct path{
int cap;
const short int to, rev;
};
vector<path> g[1110];
int bi[5110], bv[1110], bp[1110], bs, bvnr = 1, bx = 0;
path* bf[1110];
short int n, m;
int bfs(){
long long r = 0;
bs = 1;
bx = 0;
bi[0] = 1;
bvnr++;
bv[1] = bvnr;
while(bx < bs){
for(unsigned int x = 0;x<g[bi[bx]].size();x++){
auto &p = g[bi[bx]][x];
if((p.cap > 0) && (p.to == (n))){
int minf = p.cap;
for(short int x = bi[bx];x != 1;x = bp[x]){
if((bf[x]->cap) < minf){
minf = bf[x]->cap;
if(minf == 0)
goto e;
}
}
p.cap -= minf;
g[p.to][p.rev].cap += minf;
for(short int x = bi[bx];x != 1;x = bp[x]){
(bf[x])->cap -= minf;
g[bf[x]->to][bf[x]->rev].cap += minf;
}
r += minf;e:continue;
}else
if((p.cap > 0) && (bv[p.to] != bvnr)){
bv[p.to] = bvnr;
bi[bs++] = p.to;
bp[p.to] = bi[bx];
bf[p.to] = &p;
}
}
bx++;
}
return r;
}
int main(){
in>>n>>m;
long long outv = 0;
for(short int x = 0;x<m;x++){
short int a, b;
int c;
in>>a>>b>>c;
g[a].push_back({c, b, g[b].size()});
g[b].push_back({0, a, g[a].size()-1});
}
int tmp;
do{
tmp = bfs();
outv += tmp;
}while(tmp);
out<<outv<<endl;
return 0;
}