Pagini recente » Cod sursa (job #2096222) | Cod sursa (job #3195732) | Cod sursa (job #308434) | Cod sursa (job #1501775) | Cod sursa (job #298648)
Cod sursa(job #298648)
#include<stdio.h>
#include<vector>
#define INF 20000000
#define MAXN 510
using namespace std;
int n,m,i,j,S,D,x,y,z,t,fmin;
long long sol;
vector <int> a[MAXN];
int tata[MAXN],dist[MAXN];
int f[MAXN][MAXN],c[MAXN][MAXN],cost[MAXN][MAXN];
int bf()
{
int i,p,u,X,Y;
int Q[MAXN*10],inq[MAXN];
for(i=1;i<=n;i++)
{
dist[i]=INF;
inq[i]=0;
tata[i]=0;
}
p=u=1;
Q[1]=S;
dist[S]=0;
tata[S]=S;
inq[S]=1;
for(;p<=u;p++)
{
X=Q[p];
for(i=0;i<a[X].size();i++)
{
Y=a[X][i];
if(f[X][Y] < c[X][Y] && dist[X] + cost[X][Y] < dist[Y])
{
dist[Y] = dist[X] + cost[X][Y];
tata[Y]=X;
if(!inq[Y])
{
Q[++u]=Y;
inq[Y]=1;
}
}
}
inq[X]=0;
}
if(dist[D]!=INF)
return 1;
return 0;
}
int main(void)
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&S,&D);
while(m--)
{
scanf("%d%d%d%d",&x,&y,&z,&t);
c[x][y]=z;
cost[x][y]=t;
cost[y][x]=-t;
a[x].push_back(y);
a[y].push_back(x);
}
while(bf())
{
fmin=INF;
x=D;
while(x!=S)
{
fmin=min(fmin, c[tata[x]][x]-f[tata[x]][x]);
x=tata[x];
}
x=D;
while(x!=S)
{
f[tata[x]][x]+=fmin;
f[x][tata[x]]-=fmin;
x=tata[x];
}
sol+=fmin*dist[D];
}
printf("%lld\n",sol);
return 0;
}