Cod sursa(job #2313613)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 11:06:24
Problema Flux maxim de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include<cstdio>
#define I 1<<30
int l,n,m,i,s,t,*w,cp,fl,cs,cu,cm[351],u,v,j,k,co[800000],mark[351],dad[351],z[351][351],g[351],c[351][351],d[351][351];
int main()
{
	freopen("fmcm.in","r",stdin),freopen("fmcm.out","w",stdout),scanf("%d%d%d%d",&n,&m,&s,&t);
	while(m--)
		scanf("%d%d%d%d",&u,&v,&cp,&cs),c[u][v]=cp,d[u][v]=cs,d[v][u]=-cs,z[u][g[u]++]=v,z[v][g[v]++]=u;
	while(1)
	{
		for(i=1;i<=n;i++)
            cm[i]=I;
		for(cm[s]=0,j=k=1,co[1]=s,mark[s]=1;j<=k;)
			for(u=co[j++],cu=cm[j],mark[j]=0,w=z[j];*w;w++)
				if(c[u][*w]&&cu+d[u][*w]<cm[*w])
                {
                    cm[*w]=cu+d[u][*w],dad[*w]=u;
                    if(!mark[*w])
                        mark[*w]=1,co[++k]=*w;
                }
		if(cm[t]==I)
            break;
		for(fl=I,u=t;u!=s;u=dad[u])
            fl=(fl<c[dad[u]][u])?fl:c[dad[u]][u];
		for(u=t;u!=s;u=dad[u])
            c[dad[u]][u]-=fl,c[u][dad[u]]+=fl;
		l+=fl*cm[t];
	}
	printf("%d",l);
}