Cod sursa(job #750042)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 20 mai 2012 11:05:07
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <queue>

#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;
	}
}

void reset(){
	int i;
	for(i=1;i<=n;++i){
		tata[i]=0;
		viz[i]=0;
	}
}

int aflaFlux(int i){
	int sol=1<<30,tatai=tata[i];
	while(tatai){
		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){
		residual[tatai][i]-=f;
		residual[i][tatai]+=f;
		i=tatai;
		tatai=tata[i];
	}
}

int Ameliorare(){
	queue < pair<int,int> > coada;
	reset();
	coada.push(mp(1,0));
	int curent,tatacurent,i;
	bool ok=false;
	viz[1]=true;
	while(!coada.empty()){
		curent=coada.front().first;
		tatacurent=coada.front().second;
		tata[curent]=tatacurent;
		coada.pop();
		for(i=1;i<n;++i){
			if(viz[i])
				continue;
			if(residual[curent][i]){
				coada.push(mp(i,curent));
				viz[i]=true;
			}
		}
		if(residual[curent][n])
			ok=true;
	}
	if(ok==false){
		return 0;
	}
	int sol=0,f;
	for(i=1;i<n;++i){
		if(residual[i][n]){
			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;
}