Pagini recente » Cod sursa (job #2881883) | Cod sursa (job #2438261) | Cod sursa (job #2417324) | Cod sursa (job #1253750) | Cod sursa (job #3040655)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("fmcm.in");
ofstream cout ("fmcm.out");
int c[400][400],t[400],f[400][400],p[400][400],d[400];
bool viz[400];
vector<int> g[400];
int oo = 1<<28;
int n,m,s,D;
int q[10000];
int st,dr;
int bfs (int incep)
{
st = dr = 1;
q[st] = incep;
int i;
for(i=1;i<=n;i++)
{
d[i] = oo;
viz[i] = false;
}
d[incep] = 0;
viz[incep] = true;
while (st<=dr)
{
int nod = q[st];
st++;
viz[nod] = false;
for (auto vf:g[nod])
{
if (c[nod][vf]!=f[nod][vf] && d[vf] > d[nod] + p[nod][vf])
{
d[vf] = d[nod] + p[nod][vf];
t[vf] = nod;
if (viz[vf]==false)
{
viz[vf] = true;
q[++dr] = vf;
}
}
}
}
return d[D];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s >> D;
int i,j,k;
for(i=1;i<=m;i++)
{
int x,y,cap,pr;
cin >> x >> y >> cap >> pr;
g[x].push_back(y);
g[y].push_back(x);
c[x][y] = cap;
p[x][y] = pr;
p[y][x] = -pr;
}
int rasp = 0;
while (true)
{
int nou = bfs(s);
if (nou == oo)
break;
int minim = oo;
for (i=D;i!=s;i=t[i])
minim = min(minim,c[t[i]][i] - f[t[i]][i]);
for (i=D;i!=s;i=t[i])
{
f[t[i]][i] = f[t[i]][i] + minim;
f[i][t[i]] = f[i][t[i]] - minim;
}
rasp = rasp + nou*minim;
}
cout << rasp;
return 0;
}