Cod sursa(job #253641)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 6 februarie 2009 09:28:22
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#define N 800000
#define INF 2000000000
struct nod{int inf;nod *urm;};
nod *p[351],*paux;
int sol,n,m,i,s,d,u,v,cp,fl,cs,cu,cm[351],c[351][351],C[351][351],first,last,
co[N],mark[351],dad[351];
void readd(),flux();
int main()
{
	readd();
	flux();
	printf("%d\n",sol);
	return 0;
}
void readd()
{
	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",&u,&v,&cp,&cs);
		c[u][v]=cp;C[u][v]=cs;C[v][u]=-cs;
		paux=new nod;paux->inf=u;paux->urm=p[v];p[v]=paux;
		paux=new nod;paux->inf=v;paux->urm=p[u];p[u]=paux;
	}
}
void flux()
{
	for(;;)
	{
		for(i=1;i<=n;i++)cm[i]=INF;
		cm[s]=0;first=last=1;co[1]=s;mark[s]=1;
		while(first<=last)
		{
			u=co[first];cu=cm[u];mark[u]=0;
			for(paux=p[u];paux;paux=paux->urm)
				if(c[u][paux->inf])
				{
					v=paux->inf;
					if(cu+C[u][v]<cm[v])
					{
						cm[v]=cu+C[u][v];
						dad[v]=u;
						if(!mark[v]){mark[v]=1;co[++last]=v;}
					}
				}
			first++;
		}
		if(cm[d]==INF)return;
		fl=INF;
		for(u=d;u!=s;u=dad[u])fl=(fl<c[dad[u]][u])?fl:c[dad[u]][u];
		for(u=d;u!=s;u=dad[u]){c[dad[u]][u]-=fl;c[u][dad[u]]+=fl;}
		sol+=fl*cm[d];
	}
}