Cod sursa(job #673574)

Utilizator darkseekerBoaca Cosmin darkseeker Data 4 februarie 2012 17:23:22
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb

#include <fstream>
#include <utility>
#include <cassert>
#include <queue>
using namespace std;

#define in "fmcm.in"
#define out "fmcm.out"
#define NMAX 360
#define f first
#define s second
#define mp make_pair
#define inf 10000000

priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > h;
int C[NMAX][NMAX],F[NMAX][NMAX],G[NMAX][NMAX],Cost[NMAX][NMAX],T[NMAX],dist[NMAX];
int inQ[NMAX];
int N,M,S,D;

long long BF()
{
	queue<int> Q;
	
	int i;
	
	for(i = 1; i <= N; i++)
	{
		dist[i] = inf;
		inQ[i] = 0;
	}
	
	dist[S] = 0;
	Q.push(S);
	int nod;
	
	while(!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		inQ[nod] = 0;
		
		for(i = 1; i <= G[nod][0]; i++)
			if(dist[nod] + Cost[nod][G[nod][i]] < dist[G[nod][i]] && C[nod][G[nod][i]] - F[nod][G[nod][i]] > 0)
				{
					dist[G[nod][i]] = dist[nod] + Cost[nod][G[nod][i]];
					T[G[nod][i]] = nod;
					if(!inQ[G[nod][i]])
					{
						inQ[G[nod][i]] = 1;
						Q.push(G[nod][i]);
					}
				}
	}
	
	int fmin = inf;
	
	if(dist[D] != inf)
	{
		for(i = D; i != S; i = T[i])
			fmin = min(C[T[i]][i] - F[T[i]][i],fmin);
		for(i = D; i != S; i= T[i])
		{
			F[T[i]][i] += fmin;
			F[i][T[i]] -= fmin;
		}
		
		return dist[D] * fmin;
	}
	
	return 0;
}


long long Flux()
{
	long long  ans = 0;
	long long tans = 0;
	
	do{
		tans = BF();
		ans += tans;
	}while(tans);
	
	return ans;
}

int main()
{
	ifstream fin(in);
	ofstream fout(out);
	
	fin>>N>>M>>S>>D;
	
	int i,x,y,cap,cst;
	
	for(i = 1; i <= M; i++)
		{
			fin>>x>>y>>cap>>cst;
			G[x][++G[x][0]] = y;
			G[y][++G[y][0]] = x;
			C[x][y] = cap;
			C[y][x] = 0;
			Cost[x][y] = cst;
			Cost[y][x] = -cst;
	}
	
	fout<<Flux()<<'\n';
	
	fin.close();
	fout.close();
	
	return 0;
}