Cod sursa(job #749485)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 17 mai 2012 12:58:50
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#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;
}