Pagini recente » Cod sursa (job #1420634) | Cod sursa (job #594950) | Cod sursa (job #2289500) | Cod sursa (job #1205989) | Cod sursa (job #327433)
Cod sursa(job #327433)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define file_in "fmcm.in"
#define file_out "fmcm.out"
#define Inf 0x3f3f3f3f
#define Nmax 520
#define clear(x,y) memset(x,y,sizeof(x))
int n,m,C[Nmax][Nmax],P[Nmax][Nmax],F[Nmax][Nmax],viz[Nmax*Nmax],dm[Nmax*Nmax],s,d,t[Nmax*Nmax],q[Nmax*Nmax];
void citire()
{
int x,y,c,f;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d %d %d", &n,&m,&s,&d);
while(m--)
{
scanf("%d %d %d %d", &x,&y,&c,&f);
C[x][y]=c;
P[x][y]=f;
P[y][x]=-f;
}
}
inline int bf()
{
for (int i=1;i<=n;++i)
dm[i]=Inf,
viz[i]=0;
int st=0,dr=1, nod;
q[1]=s;
dm[s]=0;
viz[s]=1;
while (st<dr)
{
nod=q[++st];
for (int i=1;i<=n;++i)
if ((dm[nod]+P[nod][i]<dm[i]) && (C[nod][i]-F[nod][i]>0))
{
dm[i]=dm[nod]+P[nod][i];
t[i]=nod;
if (!viz[i])
{
q[++dr]=i;
viz[i]=1;
}
}
viz[nod]=0;
}
return (dm[d]<Inf/2);
}
void solve()
{
int sol=0;
while (bf())
{
int r=C[t[d]][d]-F[t[d]][d];
for (int i=d;i!=s;i=t[i])
if (C[t[i]][i]-F[t[i]][i]<r)
r=C[t[i]][i]-F[t[i]][i];
for (int i=d;i!=s;i=t[i])
F[t[i]][i]+=r,
F[i][t[i]]-=r;
sol+=r*dm[d];
}
printf("%d", sol);
}
int main()
{
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}