Pagini recente » Cod sursa (job #2620064) | Cod sursa (job #1504071) | Cod sursa (job #180699) | Cod sursa (job #761487) | Cod sursa (job #750489)
Cod sursa(job #750489)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define mp make_pair
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N=1010;
int n,m;
int residual[N][N];
int tata[N];
bool viz[N];
void read(){
int i,x,y,c;
in>>n>>m;
for(int i=1;i<=m;++i){
in>>x>>y>>c;
residual[x][y]=c;
}
}
int min(const int & x,const int & y){
return x<y ? x:y;
}
int aflaFlux(int i){
int sol=1<<30,tatai=tata[i];
while(tatai!=i){
sol=min(residual[tatai][i],sol);
i=tatai;
tatai=tata[i];
}
return sol;
}
void impingeFlux(int i,int f){
int tatai=tata[i];
while(tatai!=i){
residual[tatai][i]-=f;
residual[i][tatai]+=f;
i=tatai;
tatai=tata[i];
}
}
int Ameliorare(){
queue < int > coada;
queue <int> eval;
memset(tata,0,sizeof(tata));
coada.push(1);
int curent,i;
bool ok=false;
tata[1]=1;
while(!coada.empty()){
curent=coada.front();
coada.pop();
for(i=1;i<n;++i){
if( !tata[i] && residual[curent][i] ){
coada.push(i);
tata[i]=curent;
}
}
if(residual[curent][n]){
eval.push(curent);
}
}
int sol=0,f;
while(eval.empty()==false){
i=eval.front();
eval.pop();
f=min(residual[i][n],aflaFlux(i));
impingeFlux(i,f);
residual[i][n]-=f;
residual[n][i]+=f;
sol+=f;
}
return sol;
}
void FluxMaxim(){
int fluxmax=0,imbunatatire;
while(1){
imbunatatire=Ameliorare();
if(imbunatatire==0)
break;
fluxmax+=imbunatatire;
}
out<<fluxmax;
}
int main(){
read();
FluxMaxim();
return 0;
}