Cod sursa(job #1205186)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 5 iulie 2014 16:47:56
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream f("fmcm.in");
ofstream o("fmcm.out");

const int inf = 1000000000;
vector <int> a[1007],b[1009];
int n,m,s,d, semn[1009],retea[1009][1009],flux[1009][1009],parc[1009],venit[1009],ok,cost[600][600],dist[600],fmax=inf;

void df(int nod,int v,int ok1);

void marc(int nod,int tata,int v){	 

		if(semn[nod]){
			flux[tata][nod]+=v;
		}else flux[nod][tata]-=v;
		
		if(tata!=s)marc(tata,venit[tata],v);	   	
}


void df(int nod,int v,int ok1){
	
	if(nod==d){
	//	marc(nod,venit[nod],v);
	//	ok=0;
	    fmax = v;
		return;
	}

	for(int i=0;i<a[nod].size();i++)
	  if(dist[nod]+cost[nod][a[nod][i]]<dist[a[nod][i]] && flux[nod][a[nod][i]]<retea[nod][a[nod][i]] && ok==ok1){
	  	 venit[a[nod][i]]=nod;
	  	 dist[a[nod][i]]=dist[nod]+cost[nod][a[nod][i]];
	  	 semn[a[nod][i]]=1;
	  	 df(a[nod][i],min(v,retea[nod][a[nod][i]]-flux[nod][a[nod][i]]),ok1);	  	 
	  }
	for(int i=0;i<b[nod].size();i++)
	  if(dist[nod]-cost[b[nod][i]][nod]<dist[b[nod][i]]  && flux[b[nod][i]][nod]>0 && ok==ok1){
	  	 venit[b[nod][i]]=nod;
	  	 dist[b[nod][i]] = dist[nod]-cost[b[nod][i]][nod];
	  	 semn[b[nod][i]]=0;
	  	 df(b[nod][i],min(v,flux[b[nod][i]][nod]),ok1);	  	 
	  }	    
	
}

int main(){
	f>>n>>m>>s>>d;
	int x,y,z,w;
	for(int i=1;i<=m;i++){
		f>>x>>y>>z>>w;
		retea[x][y]=z;
		cost[x][y]=w;
		a[x].push_back(y);
		b[y].push_back(x);
	}
	int stop = 1,sol=0;
	while(stop){
		fmax = inf;stop = 0;
		for(int i=1;i<=n;i++)parc[i]=0,dist[i]=inf;
		dist[s]=0;
		ok=1;	
		df(s,inf,ok);
		if(fmax!=inf){
			sol+=fmax*dist[d];
			marc(d,venit[d],fmax);
			stop=1;
		}
	}

	

/*	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)o<<retea[i][j]<<" ";
		o<<endl;
	}
	o<<endl;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)o<<flux[i][j]<<" ";
		o<<endl;
	}*/
	o<<sol;
}