Cod sursa(job #749591)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 17 mai 2012 19:21:19
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <queue>
#include <cstring>

#define costq first
#define dinq second.second
#define nodq second.first

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];

typedef pair<int, pair<int,int> > triplet;

void read(){
	int i,x,y,z;
	in>>n>>m;
	for(i=1;i<=m;++i){
		in>>x>>y>>z;
		flux[x][y]=z;
	}
}

triplet mt(int x,int y,int z){
	triplet aux;
	aux.costq=x;
	aux.dinq=z;
	aux.nodq=y;
	return aux;
}

inline int min(const int & x,const int & y){
	return x<y ? x:y;
}

int rez;

void update(){
	int aux;
	aux=n;
	int d=din[aux];
	while(d){
		flux[d][aux]-=rez;
		flux[aux][d]+=rez;
		aux=d;
		d=din[aux];
	}
}

int Ameliorare(){
	int i,aux,sol=0;
	rez=0;
	priority_queue < triplet > coada;
	triplet curent;
	memset(cale,0,sizeof(cale));
	memset(din,0,sizeof(din));
	coada.push(mt(INF,1,0));
	while(coada.empty()==false){
		curent=coada.top();
		coada.pop();
		if(curent.nodq==n){
			cale[curent.nodq]=curent.costq;
			din[curent.nodq]=curent.dinq;
			rez=cale[n];
			sol+=rez;
			update();
			continue;
		}
		aux=curent.nodq;
		cale[aux]=curent.costq;
		din[aux]=curent.dinq;
		for(i=1;i<=n;++i){
			if(din[i]==0 && flux[aux][i]!=0 && cale[i]<min(flux[aux][i],cale[aux])){
				cale[i]=min(flux[aux][i],cale[aux]);
				coada.push(mt(min(flux[aux][i],cale[aux]),i,aux));
			}
		}
	}
	return rez;
}

int FordFulkerson(){
	int f=0,mareste;
	while(true){
		mareste=Ameliorare();
		if(mareste<=0)
			return f;
		f+=mareste;
	}
}

int main(){
	read();
	out<<FordFulkerson();
	return 0;
}