Pagini recente » Cod sursa (job #2672922) | Cod sursa (job #13882) | Cod sursa (job #288435) | Cod sursa (job #2569552) | Cod sursa (job #1168136)
#include <iostream>
#include <vector>
#include <bitset>
#include <fstream>
#define DN 1005
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m;
vector < int > lst[DN];
bitset < DN > viz;
int C[DN][DN],S,D,prec[DN],arb[DN],F[DN][DN],t[DN],flow;
void read(){
f>>n>>m;
for(;m--;)
{
int a,b,c;
f>>a>>b>>c;
C[a][b] = c;
lst[a].pb(b);
lst[b].pb(a);
}
S=1; D=n;
}
bool bf(){
for(int i=1;i<=n;++i){
viz[i] = false;
prec[i] = 0;
}
arb[0] = 1;
arb[1] = S;
for(int i=1;i<=arb[0];++i){
int nod = arb[i];
for(int i=0;i<lst[nod].size();++i){
int next_nod = lst[nod][i];
if(C[nod][next_nod] == F[nod][next_nod] || viz[next_nod])
continue;
arb[ ++arb[0] ] = next_nod;
viz[ next_nod ] = true;
t[next_nod] = nod;
}
}
return viz[D];
}
void solve(){
bool exista_flux = true;
for(;exista_flux;){
exista_flux = bf();
for(int i=0;i<lst[D].size();++i){
int nod = lst[D][i],fmin=(1<<30);
if(C[nod][D] == F[nod][D] || !viz[nod])
continue;
t[D] = nod;
for(int nod = D; nod != S ; nod=t[nod])
fmin=min(fmin,C[t[nod]][nod] - F[t[nod]][nod]);
if(fmin==0)
continue;
for(int nod = D; nod != S ; nod=t[nod]){
F[ t[nod] ][ nod ] +=fmin;
F[ nod ][ t[nod] ] -=fmin;
}
flow+=fmin;
}
}
g<<flow;
}
int main()
{
read();
solve();
return 0;
}