Cod sursa(job #931197)

Utilizator taigi100Cazacu Robert taigi100 Data 28 martie 2013 02:06:31
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;

//I consider this problem the most retarded one xD

#define max 355
#define inf 0x3f3f3f3f
int n,m,s,d,C[max][max],Cst[max][max];
vector<int> con[max];
int f,fcst;

int old_d[max];
bool inQ[max];
queue<int>Q;

int D[max],real_d[max],p[max];
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > H;





bool dijkstra()
{
	memset(D,0x3f,sizeof(d));
	D[s]=0;real_d[s]=0;
	H.push(make_pair(D[s],s));

	while( !H.empty() )
	{
		int cst=H.top().first, nod=H.top().second;
		H.pop();
		if(D[nod]!=cst)
			continue;
		vector<int>::iterator it;
		for(it=con[nod].begin();it!=con[nod].end();it++)
			if(C[nod][*it])
			{
				int new_d = D[nod]+Cst[nod][*it] + old_d[nod] - old_d[*it];
				if(new_d< D[*it])
				{
					D[*it]=new_d;
					real_d[*it] = real_d[nod]+Cst[nod][*it];
					p[*it]=nod;
					H.push(make_pair(D[*it],*it));
				}
			}
	}
	memcpy(old_d,real_d,sizeof(D));
	if(D[d] == inf )
		return false;

	int Min=inf, cC=0;
	for(int i=d;i!=s;i=p[i])
	   Min=min(Min,C[p[i]][i]), cC+=Cst[p[i]][i];
	f+=Min;
	fcst+=Min*real_d[d];
	for(int i=d;i!=s;i=p[i])
		 C[p[i]][i] -= Min,
        C[i][p[i]] += Min;
	return true;

}

void bellman()
{
	memset(old_d,0x3f,sizeof(old_d));
	old_d[s]=0;
	Q.push(s);
	inQ[s]=1;
	for(;!Q.empty();Q.pop())
	{
		vector<int>::iterator it;
		int x=Q.front();
		inQ[x]=0;

		for(it = con[x].begin(); it!=con[x].end(); it++)
		if(C[x][*it])
		{
			if(old_d[x]+Cst[x][*it] >= old_d[*it])
				continue;
			old_d[*it]=old_d[x]+Cst[x][*it];
			if(inQ[*it])
				continue;
			inQ[*it]=1;
			Q.push(*it);
		}
	}
}

int main()
{
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);

	scanf("%d%d%d%d",&n,&m,&s,&d);

	while(m)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		con[x].push_back(y);
		con[y].push_back(x);
		scanf("%d %d",C[x]+y,Cst[x]+y);
		Cst[y][x]=-Cst[x][y];
	}

	f=fcst=0;
	bellman();

	while(dijkstra());
	printf("%d\n",fcst);
	return 0;
}