Pagini recente » Cod sursa (job #1938321) | Cod sursa (job #570552)
Cod sursa(job #570552)
#include<stdio.h>
#include<string.h>
#define ll long long
#define minim(a,b) (a<b ? a : b)
#define INF 2000000000
#define NMAX 405
#define MMAX 25004
int n,m,px,py,dist[NMAX],pred[NMAX];
int x[MMAX],y[MMAX],cap[MMAX],cost[MMAX],inv[MMAX];
int f[MMAX],sol;
ll rez;
int bellman(int start,int dest)
{
int i,j;
memset(pred,0,sizeof(pred));
for(i=1;i<=n;i++)
dist[i]=INF;
dist[start]=0;
for(i=1;i<n;i++)
for(j=1;j<=m;j++)
if(cap[j]>f[j] && dist[x[j]]!=INF
&& dist[x[j]]+cost[j]<dist[y[j]])
{
dist[y[j]]=dist[x[j]]+cost[j];
pred[y[j]]=j;
}
return dist[dest]!=INF;
}
int main ()
{
int i;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&px,&py);
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x[i],&y[i],&cap[i],&cost[i]);
x[m+i]=y[i];
y[m+i]=x[i];
cap[m+i]=0;
cost[m+i]=-cost[i];
inv[m+i]=i;
inv[i]=m+i;
}
m*=2;
while(bellman(px,py))
{
sol=INF;
for(i=py;i!=px;i=x[pred[i]])
sol=minim(sol,cap[pred[i]]-f[pred[i]]);
for(i=py;i!=px;i=x[pred[i]])
{
f[pred[i]]+=sol;
f[inv[pred[i]]]-=sol;
}
}
for(i=1;i<=m/2;i++)
rez+=f[i]*cost[i];
printf("%lld\n",rez);
return 0;
}