Cod sursa(job #750488)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 22 mai 2012 12:50:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#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;
	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(residual[curent][i] && !tata[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;
}