Pagini recente » Cod sursa (job #1821962) | Cod sursa (job #1433614) | Cod sursa (job #179375) | Cod sursa (job #2586313) | Cod sursa (job #749485)
Cod sursa(job #749485)
#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],p[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 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));
for(i=1;i<=n;++i)
p[i]=INF;
coada.push(1);
viz[1]=true;
while(!coada.empty()){
curent=coada.front();
coada.pop();
for(i=1;i<n;++i){
if(flux[curent][i] && !viz[i]){
din[i]=curent;
p[i]=min(flux[curent][i],p[curent]);
viz[i]=true;
coada.push(i);
}
}
if(flux[curent][n]){
p[curent]=min(flux[curent][n],p[curent]);
update.push(curent);
}
}
int aux,d,red;
int sol=0;
while(update.empty()==false){
aux=update.front();
update.pop();
d=din[aux];
red=p[aux];
flux[aux][n]-=red;
flux[n][aux]+=red;
sol+=red;
while(d){
flux[d][aux]-=red;
flux[aux][d]+=red;
aux=d;
d=din[aux];
}
}
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;
}