Cod sursa(job #2785543)

Utilizator betybety bety bety Data 18 octombrie 2021 21:22:27
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>

#define N 800000

#define INF 2000000000

int sol,n,m,i,s,d,u,w,*v,cp,fl,cs,cu,cm[351],first,last,

co[N],mark[351],dad[351],vec[351][351],gr[351];

short int c[351][351],C[351][351];

void readd(),flux();

int main()

{

	readd();

	flux();

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

	return 0;

}

void readd()

{	v=new int;

	freopen("fmcm.in","r",stdin);

	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;

	}

	freopen("fmcm.out","w",stdout);

}

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(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]==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];

	}

}