Pagini recente » Cod sursa (job #1278814) | Cod sursa (job #2276789) | Cod sursa (job #1259754) | Cod sursa (job #2293868) | Cod sursa (job #750486)
Cod sursa(job #750486)
#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 capacitate[N][N],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;
capacitate[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;
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(residual[curent][i] && !tata[i]){
coada.push(i);
tata[i]=curent;
}
}
}
int sol=0,f;
for(i=2;i<n;++i){
if(residual[i][n]){
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;
}