Cod sursa(job #430366)

Utilizator za_wolfpalianos cristian za_wolf Data 30 martie 2010 22:23:45
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
//#include "stdafx.h"
#include<stdio.h>
#include<algorithm>
#define NMAX 351
#define inf 10000000
using namespace std;
int x[NMAX][NMAX],dd,viz[NMAX],sol,dist[NMAX],i,j,n,m,k,l,a,s,b,d,nod,in,sf,c,rez,flux[NMAX][NMAX],y[NMAX][NMAX];
struct kkt
{	
	int X,Y,Z;
} q[NMAX*NMAX];
void solve()
{
	in=sf=1;
	a=0;
	q[1].X=s;
	q[1].Z=inf;
	for (i=1;i<=n;i++)
		dist[i]=inf , viz[i]=0;
	dist[s]=0;
	viz[s]=1;
	while (in<=sf)
	{
		nod=q[in].X;
		for (i=1;i<=n;i++)
			if (x[nod][i]||x[i][nod])
					if (dist[i]>dist[nod]+y[nod][i])
					{
						rez=x[nod][i]-flux[nod][i];
						if (rez)
						{
							dist[i]=dist[nod]+y[nod][i];
							if (!viz[i])
							{
								sf++;
								q[sf].X=i;
								q[sf].Y=in;
								q[sf].Z=min(rez,q[in].Z);
								viz[i]=sf;
							}
							else
							{
								q[viz[i]].X=i;
								q[viz[i]].Y=in;
								q[viz[i]].Z=min(rez,q[in].Z);
							}
							
						}
					}
		viz[nod]=0;
		in++;
	}
	if (dist[d]==inf)
		return ;
	while (q[sf].X!=d)
		sf--;
	a=1;
	rez=q[sf].Z;
	while (sf)
	{
		nod=q[sf].X;
		k=q[sf].Y;
		flux[q[k].X][nod]+=rez;
		sol+=rez*y[q[k].X][nod];
		flux[nod][q[k].X]-=rez;
		sf=q[sf].Y;
	}
}
int main()
{	
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&s,&d);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&a,&b,&c,&dd);
		x[a][b]=c;
		y[a][b]=dd;
		y[b][a]=-dd;
	}
	a=1;
	while (a)
		solve();

	printf("%d\n",sol);

	return 0;
}