Pagini recente » Cod sursa (job #3240180) | Cod sursa (job #2511894) | Cod sursa (job #1936130) | Cod sursa (job #2393589) | Cod sursa (job #570548)
Cod sursa(job #570548)
#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];
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];
}
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;
if(pred[i]<=m)
f[pred[i]+m]-=sol;
else
f[pred[i]-m]-=sol;
rez+=cost[pred[i]]*sol;
}
}
printf("%lld\n",rez);
return 0;
}