Cod sursa(job #681590)

Utilizator cdascaluDascalu Cristian cdascalu Data 17 februarie 2012 14:37:48
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<cstring>
#define MAX 351
#define INF 0x3f3f3f
using namespace std;
vector< pair<short int,short int> > G[MAX];
int N,M,S,D,cost;
short int C[MAX][MAX],F[MAX][MAX],in[MAX],T[MAX];
int d[MAX];
queue<short int> Q;
void read()
{
	FILE*f = fopen("fmcm.in","r");
	fscanf(f,"%d%d%d%d",&N,&M,&S,&D);
	int i,x,y,c,z;
	for(i=1;i<=M;++i)
	{
		fscanf(f,"%d%d%d%d",&x,&y,&c,&z);
		G[x].push_back(make_pair(y,z));
		G[y].push_back(make_pair(x,-z));
		C[x][y] = c;
	}
	fclose(f);
}
int BF(int S,int D)
{
	memset(d,INF,sizeof(d));
	memset(T,0,sizeof(T));
	memset(in,0,sizeof(in));
	d[S] = 0;
	T[S] = S;
	Q.push(S);
	int nod;
	vector< pair<short int,short int> >::iterator it;
	while(Q.size())
	{
		nod = Q.front();
		Q.pop();
		in[nod] = 0;
		if(nod == D)continue;
		for(it = G[nod].begin();it!=G[nod].end();++it)
			if(it->second + d[nod] < d[it->first] && C[nod][it->first] > F[nod][it->first])
			{
				T[it->first] = nod;
				d[it->first] = it->second + d[nod];
				if(!in[it->first])
				{
					in[it->first] = 1;
					Q.push(it->first);
				}
			}
	}
	return T[D];
}
int main()
{
	read();
	int r,i;
	while(BF(S,D))
	{
		i = D;
		r = INF;
		while(i!=S)
		{
			r = min(r,C[T[i]][i] - F[T[i]][i]);
			i = T[i];
		}
		if(r==0)continue;
		i = D;
		while(i!=S)
		{
			F[T[i]][i] += r;
			F[i][T[i]] -= r;
			i = T[i];
		}
		cost+=r*d[D];
	}
	FILE*g = fopen("fmcm.out","w");
	fprintf(g,"%d\n",cost);
	fclose(g);
	return 0;
}