Pagini recente » Cod sursa (job #821437) | Cod sursa (job #4025) | Cod sursa (job #929049) | Cod sursa (job #1146232) | Cod sursa (job #256345)
Cod sursa(job #256345)
#include <stdio.h>
#define IN "fmcm.in"
#define OUT "fmcm.out"
#define MAX 800000
#define MAX2 352
#define INF 2000000000
FILE *fin=fopen(IN,"r");
FILE * fout=fopen(OUT,"w");
int sol,s,n,m,d,u,w,*v,cp,cu,fl,cs,first,last;
int cm[MAX2],co[MAX],mark[MAX2],dad[MAX2],gr[MAX2];
int vec[MAX2][MAX2],c[MAX2][MAX2],C[MAX2][MAX2];
void citire();
void flux();
int main()
{
citire();
fclose(fin);
flux();
fprintf(fout,"%d\n",sol);
fclose(fout);
return 0;
}
void citire()
{
int i;
v=new int;
fscanf(fin,"%d%d%d%d",&n,&m,&s,&d);
for(i=1;i<=m;i++)
{
fscanf(fin,"%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;
}
}
void flux()
{
int i;
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];
}
}