Cod sursa(job #749631)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 17 mai 2012 21:31:45
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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];
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;
}