Cod sursa(job #305699)

Utilizator FlorianFlorian Marcu Florian Data 18 aprilie 2009 12:38:08
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define MAX_N 355
#define Inf 0x3f3f3f3f
vector<short int>G[MAX_N];
int dist[MAX_N];
short int S,D,N,M;
short int cst[MAX_N][MAX_N];
short int f[MAX_N][MAX_N];
short int capac[MAX_N][MAX_N];
bitset<MAX_N>viz;
queue<int>Q;
int tata[MAX_N];
int Sum;
short int min(const short int &a, const short int &b)
{
	return (a>b)?(b):(a);
}
void flux()
{
	int x, y, flmin;
	unsigned i;
	for(;;)
	{
		Q.push(S);
		for(i=1;i<=N;++i) 
		{
			dist[i] = Inf; 
			viz[i] = 0;
		}
		dist[S] = 0;
		for(;!Q.empty();Q.pop())
		{
			x = Q.front();
			viz[x] = 0;
			for(i=0;i<G[x].size();++i)
			{
				y = G[x][i];	
				if(f[x][y] < capac[x][y] && dist[y] > dist[x] + cst[x][y])
				{
					dist[y] = dist[x] + cst[x][y];
					tata[y] = x;
					if(!viz[y])
					{
						viz[y] = 1;
						Q.push(y);
					}
				}
			}
		}
		if(dist[D] == Inf) return;
		flmin = Inf;
		for(i=D;i!=S;i=tata[i])
			flmin = min(flmin,capac[tata[i]][i] - f[tata[i]][i]);
		if(flmin == 0) continue;
		for(i=D;i!=S;i=tata[i])
		{
			f[tata[i]][i] += flmin;
			f[i][tata[i]] -= flmin;
		}
		Sum += flmin * dist[D];
	}
}
int main()
{
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%hd%hd%hd%hd",&N,&M,&S,&D);
	int i;
	short int x,y,capacitate,cost;
	for(i=1;i<=M;++i)
	{
		scanf("%hd%hd%hd%hd",&x,&y,&capacitate,&cost);
		cst[x][y] = cost;
		cst[y][x] = -cost;
		capac[x][y] = capacitate;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	flux();
	printf("%d\n",Sum);
	return 0;
}