Pagini recente » Cod sursa (job #544936) | Cod sursa (job #2494760) | Cod sursa (job #78646) | Cod sursa (job #2037125) | Cod sursa (job #357366)
Cod sursa(job #357366)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define Inf 100000000
#define Nmax 351
#define Qmax 512
#define Mod &(Qmax-1)
int C[Nmax][Nmax], P[Nmax][Nmax], F[Nmax][Nmax], v[Nmax], t[Nmax], dm[Nmax], s,d,m,n, q[Qmax];
long long COST;
vector <int> l[Nmax];
int BF()
{
for (int i=1;i<=n;++i)
dm[i] = Inf,
v[i] = 0;
int st=0,dr=1, nod;
q[1] = s;
dm[s] = 0;
v[s] = 1;
while (st<dr)
{
nod = q[(++st)Mod];
for (int j=0;j<(int)l[nod].size();++j)
{
#define i l[nod][j]
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 (v[i] == 0)
{
q[(++dr)Mod] = i;
v[i] = 1;
}
}
#undef i
}
v[nod] = 0;
}
return (dm[d]<Inf/2)?1:0;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d", &n,&m,&s,&d);
int x,y,z,c;
for (int i=1;i<=m;++i)
{
scanf("%d%d%d%d", &x,&y,&c,&z);
l[x].push_back(y);
l[y].push_back(x);
C[x][y] = c;
P[x][y] = z;
P[y][x] = -z;
}
for (int i=1;i<=n;++i)
sort(l[i].begin(),l[i].end());
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;
COST += r*dm[d];
}
printf("%lld\n", COST);
return 0;
}