Cod sursa(job #712765)

Utilizator maritimCristian Lambru maritim Data 13 martie 2012 19:35:10
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;

FILE *f = fopen("fmcm.in","r");
FILE *g = fopen("fmcm.out","w");

typedef vector<int>::iterator it;

#define MaxN 400

int N,M,S,d,CostMinim,flux[MaxN][MaxN],cost[MaxN][MaxN],D[MaxN],T[MaxN],inCoada[MaxN];
vector<int> A[MaxN];

void citire(void)
{
	int a,b,z,c;
	
	fscanf(f,"%d %d %d %d",&N,&M,&S,&d);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d %d",&a,&b,&z,&c);
		A[a].push_back(b);
		A[b].push_back(a);
		flux[a][b] = z;
		cost[a][b] = c;
		cost[b][a] = -c;
	}
}

inline void Stergere(void)
{
	for(int i=1;i<=N;i++)
		T[i] = D[i] = inCoada[i] = 0;
	
	inCoada[S] = 1;
}

inline int min(int a,int b)
{
	return a < b ? a : b;
}

inline int DF(void)
{
	queue<int> Q;
	
	Stergere();
	
	for(Q.push(S);!Q.empty();inCoada[Q.front()] = 0,Q.pop())
		for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
			if(flux[Q.front()][*i] > 0)
				if(!T[*i] || D[*i] > D[Q.front()] + cost[Q.front()][*i])
				{
					D[*i] = D[Q.front()]+cost[Q.front()][*i];
					T[*i] = Q.front();
					
					if(!inCoada[*i])
					{
						Q.push(*i);
						inCoada[*i] = 1;
					}
				}
				
	return T[d];
}

void Flux(void)
{
	for(;DF();)
	{
		int Min = 1283712;
		
		for(int i=d;i!=S;i=T[i])
			Min = min(Min,flux[T[i]][i]);
		
		for(int i=d;i!=S;i=T[i])
		{
			flux[T[i]][i] -= Min;
			flux[i][T[i]] += Min;
		}
		
		CostMinim += Min*D[d];
	}
}

int main()
{
	citire();
	Flux();
	
	fprintf(g,"%d\n",CostMinim);
	
	return 0;
}