Cod sursa(job #584930)

Utilizator crushackPopescu Silviu crushack Data 27 aprilie 2011 13:10:52
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#include <algorithm>
#define NMax 400
#define INF 2000000000
using namespace std;

const char IN[]="fmcm.in",OUT[]="fmcm.out";

int N,M,S,D;
int T[NMax],P[NMax],C[NMax][NMax],F[NMax][NMax];
vector< pair<int,int> > ad[NMax];

bool inQue[NMax],done;

int BellmanFord(int s)
{
	int x;
	queue<int> qu;
	
	qu.push(s);
	for (int i=0;i<N;++i) T[i]=INF;
	T[s]=0;
	while (!qu.empty())
	{
		x=qu.front();
		qu.pop();
		inQue[x]=false;
		
		for (vector<pair<int,int> >::iterator it=ad[x].begin();it<ad[x].end();++it)
			if (C[x][it->first]>F[x][it->first] && T[x]+it->second<T[it->first])
			{
				T[it->first]=T[x]+it->second;
				P[it->first]=x;
				if (!inQue[it->first])
					qu.push(it->first),
					inQue[it->first]=true;
			}
	}
	
	if (T[D]!=INF)
	{
		int Fmin=INF,i;
		done=false;
		
		for (i=D;i!=S;i=P[i]) 
			Fmin=min(Fmin,C[P[i]][i]-F[P[i]][i]);
		
		for (i=D;i!=S;i=P[i])
		{
			F[P[i]][i]+=Fmin;
			F[i][P[i]]-=Fmin;
		}
		return Fmin*T[D];
	}
	return 0;
}

long long Flux()
{
	long long ret=0;
	
	while (!done)
	{
		done=true;
		ret+=BellmanFord(S);
	}
	return ret;
}

int main()
{
	int i,x,y,cost,cap;
	freopen(IN,"r",stdin);
	scanf("%d%d%d%d",&N,&M,&S,&D);--S;--D;
	for (i=0;i<M;++i)
	{
		scanf("%d%d%d%d",&x,&y,&cap,&cost);
		ad[x-1].push_back( make_pair(y-1,cost) );
		ad[y-1].push_back( make_pair(x-1,-cost));
		
		C[x-1][y-1]=cap;
	}
	fclose(stdin);
	
	
	freopen(OUT,"w",stdout);
	printf("%I64d\n",Flux());
	fclose(stdout);
	
	return 0;
}