Pagini recente » Cod sursa (job #1107423) | Cod sursa (job #2165959) | Cod sursa (job #2769317) | Cod sursa (job #842462) | Cod sursa (job #280994)
Cod sursa(job #280994)
#include<stdio.h>
#include <string.h>
#define inf 2000000000
long t,p,u,s,d,i,n,parinte[1001],c[51][51],m,x,y,z,fluxm,min,dist[1001],cost[51][51];
int bf()
{ long i,j,k;for(i=1;i<=n;i++)
{dist[i]=inf;parinte[i]=0;}
dist[s]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(c[j][k]&&dist[k]>dist[j]+cost[j][k]&&dist[j]<inf)
{dist[k]=dist[j]+cost[j][k];
parinte[k]=j;
}
if(parinte[d])return 1;else return 0;
}
int main()
{ freopen("fmcm.in","r",stdin); freopen("fmcm.out","w",stdout);
scanf("%ld%ld%ld%ld",&n,&m,&s,&d);
for(i=1;i<=m;i++)
{ scanf("%ld%ld%ld%ld",&x,&y,&z,&t);
c[x][y]=z;cost[x][y]=t;cost[y][x]=-t;
}
while(bf())
{/*for(i=1;i<=n;i++)
{
if(parinte[i]<=0||c[i][n]<=0)continue;*/
min=c[parinte[d]][d]; x=parinte[d];
while(parinte[x])
{ if(c[parinte[x]][x]<min) min=c[parinte[x]][x];
x=parinte[x];
}
x=parinte[d];fluxm+=min*dist[d];c[parinte[d]][d]-=min;c[d][parinte[d]]+=min;
while(parinte[x])
{ c[parinte[x]][x]-=min;
c[x][parinte[x]]+=min;
x=parinte[x];
}
// }
memset(parinte,0,sizeof(parinte));
}
printf("%ld",fluxm);
fclose(stdout);
return 0;
}