Pagini recente » Cod sursa (job #183032) | Cod sursa (job #1817058) | Cod sursa (job #273453) | Cod sursa (job #663053) | Cod sursa (job #302042)
Cod sursa(job #302042)
#include<stdio.h>
#define N 800000
#define INF 2000000000
int sol, n, m, i, s, d, u, w, *v, cp;
int fl, cs, cu, cm[351], first, last;
int co[N], mark[351], dad[351], vec[351][351], gr[351];
short int c[351][351], C[351][351];
void flux()
{
for(;;)
{
for(i = 1; i <= n; i++) cm[i] = INF;
cm[s] = 0; first = last = 1; co[1] = s; mark[s] = 1;
while(first <= last)
{
u = co[first++];
cu = cm[u];
mark[u] = 0;
for(v = vec[u]; *v; v++)
if(c[u][*v] && cu + C[u][*v] < cm[*v])
{
cm[*v] = cu + C[u][*v];
dad[*v] = u;
if(!mark[*v])
{
mark[*v] = 1; co[++last] = *v;
}
}
}
if(cm[d] == INF) return;
fl = INF;
for(u = d; u != s; u = dad[u]) fl = (fl < c[dad[u]][u]) ? fl : c[dad[u]][u];
for(u = d; u != s; u = dad[u])
{
c[dad[u]][u] -= fl;
c[u][dad[u]] += fl;
}
sol += fl * cm[d];
}
}
int main()
{
v = new int;
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out","w",stdout);
scanf("%d %d %d %d", &n, &m, &s, &d);
for(i = 1; i <= m; i++)
{
scanf("%d %d %d %d", &u, &w, &cp, &cs);
c[u][w] = cp;
C[u][w] = cs;
C[w][u] = -cs;
vec[u][gr[u]++] = w;
vec[w][gr[w]++] = u;
}
flux();
printf("%d\n",sol);
return 0;
}