Cod sursa(job #2313616)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 11:10:02
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include<cstdio>
#define I 1<<30
int sol,n,m,i,s,d,u,w,*v,cp,fl,cs,cu,cm[351],first,last,co[800000],mark[351],dad[351],vec[351][351],gr[351],c[351][351],C[351][351];
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",&u,&w,&cp,&cs);
		c[u][w]=cp;C[u][w]=cs;C[w][u]=-cs;
		vec[u][gr[u]++]=w;vec[w][gr[w]++]=u;
	}
	while(1)
	{
		for(i=1;i<=n;i++)
            cm[i]=I;
		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(v=vec[u];*v;v++)
				if(c[u][*v]&&cu+C[u][*v]<cm[*v])
					{
						cm[*v]=cu+C[u][*v];
						dad[*v]=u;
						if(!mark[*v]){mark[*v]=1;co[++last]=*v;}
					}
		}
		if(cm[d]==I)
            break;
		fl=I;
		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];
	}
	printf("%d\n",sol);
}