Cod sursa(job #2313611)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 11:03:44
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,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,u=v=1,co[1]=s,mark[s]=1;u<=v;)
			for(u=co[u++],cu=cm[u],mark[u]=0,w=z[u];*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[++v]=*w;
                }
		if(cm[t]==I)
            return;
		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);
}