Pagini recente » Cod sursa (job #452694) | Cod sursa (job #2740193) | Cod sursa (job #370439) | Cod sursa (job #1050575) | Cod sursa (job #749631)
Cod sursa(job #749631)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N=1010;
const int INF=1<<30;
int n,m;
int flux[N][N],din[N],cale[N];
bool viz[N];
void read(){
int i,x,y,z;
in>>n>>m;
for(i=1;i<=m;++i){
in>>x>>y>>z;
flux[x][y]=z;
}
}
inline int min(const int & x,const int & y){
return x<y ? x:y;
}
int alfa_flux(int x){
int aux,rez=INF;
aux=din[x];
while(aux){
rez=min(rez,flux[aux][x]);
x=aux;
aux=din[x];
}
return rez;
}
void impinge_flux(int x,int f){
int aux;
aux=din[x];
while(aux){
flux[aux][x]-=f;
flux[x][aux]+=f;
x=aux;
aux=din[x];
}
}
int Ameliorare(){
int i,rez=0,curent;
queue <int> coada,update;
memset(cale,0,sizeof(cale));
memset(din,0,sizeof(din));
memset(viz,0,sizeof(viz));
coada.push(1);
viz[1]=true;
bool ok=false;
while(!coada.empty()){
curent=coada.front();
coada.pop();
for(i=1;i<n;++i){
if(flux[curent][i] && !viz[i]){
din[i]=curent;
viz[i]=true;
coada.push(i);
}
}
if(flux[curent][n])
ok=true;
}
if(ok==false)
return 0;
int sol=0,f;
for(i=1;i<n;++i){
if(flux[i][n]){
f=min(alfa_flux(i),flux[i][n]);
sol+=f;
impinge_flux(i,f);
flux[i][n]-=f;
flux[n][i]+=f;
}
}
return sol;
}
int FordFulkerson(){
int f=0,mareste;
while(true){
mareste=Ameliorare();
if(mareste<=0)
return f;
f+=mareste;
}
}
int main(){
read();
out<<FordFulkerson();
return 0;
}