Pagini recente » Cod sursa (job #2005111) | Monitorul de evaluare | Cod sursa (job #1867843) | Clasament oni_2010_ramas | Cod sursa (job #2409890)
#include<fstream>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
//----------------------------------
//Globale
int sol,n,co[800001],ver[352],pre[352],v[352][352],S,D,*val;
short c[352][352],C[352][352];
//----------------------------------
//Functii
void citeste();
void flux();
//----------------------------------
int main()
{
citeste();
flux();
return 0;
}
//----------------------------------
void flux()
{
int d[352],cu;
while(1)
{
for(int i = 1; i <= n; ++i)
d[i] = 2000000000;
d[S] = 0;
int in = 1;
int sf = 1;
co[1] = S;
ver[S] = 1;
while(in <= sf)
{
int x = co[in++];
cu = d[x];
ver[x] = 0;
for(val = v[x]; *val; ++val)
if(c[x][*val] && cu + C[x][*val] < d[*val])
{
d[*val] = cu+C[x][*val];
pre[*val] = x;
if(!ver[*val])
{
ver[*val] = 1;
co[++sf] = *val;
}
}
}
if(d[D] == 2000000000)
{
g << sol;
return;
}
int x = 2000000000;
for(int i = D; i != S; i = pre[i])
if(x > c[pre[i]][i])
x = c[pre[i]][i];
for(int i = D; i != S; i = pre[i])
{
c[pre[i]][i] -= x;
c[i][pre[i]] += x;
}
sol += x * d[D];
}
}
//----------------------------------
void citeste()
{
val = new int;
int m;
int ap[352] = {0};
f >> n >> m >> S >> D;
for(int i = 1; i <= m; ++i)
{
int x,y,a,b;
f >> x >> y >> a >> b;
c[x][y] = a;
C[x][y] = b;
C[y][x] = -b;
v[x][ap[x]++] = y;
v[y][ap[y]++] = x;
}
}