Pagini recente » Cod sursa (job #1294230) | Cod sursa (job #2425552) | Cod sursa (job #123050) | Cod sursa (job #2402274) | Cod sursa (job #1332848)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
#define NMax 355
#define inf 2100000000
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n,m;
int S,D;
int C[NMax][NMax],F[NMax][NMax],Cst[NMax][NMax];
int ant[NMax],d[NMax];
bool viz[NMax];
int cost;
bitset<NMax> B;
vector<int> v[NMax];
queue<int> cd;
int BellmanFord(int s)
{
for(int i=1;i<=n;++i) d[i] = inf;
d[S] = 0;
cd.push(s);
while(!cd.empty())
{
s = cd.front(); cd.pop();
B[s] = 0;
for(int i=0;i<v[s].size();++i) if(F[s][v[s][i]]<C[s][v[s][i]]) if(d[v[s][i]] > d[s] + Cst[s][v[s][i]])
{
d[v[s][i]] = d[s] + Cst[s][v[s][i]];
ant[v[s][i]] = s;
if(!B[v[s][i]])
{
cd.push(v[s][i]);
B[v[s][i]] = 1;
}
}
}
if(d[D] == inf) return false;
return true;
}
int main()
{
int x,y,c,z;
f>>n>>m>>S>>D;
while(m--)
{
f>>x>>y>>c>>z;
v[x].push_back(y);
v[y].push_back(x);
C[x][y] += c;
Cst[x][y] = z;
Cst[y][x] = -z;
}
int s,fmin;
while(BellmanFord(S))
{
fmin = inf;
s = D;
while(ant[s])
{
fmin = min(fmin,C[ant[s]][s]-F[ant[s]][s]);
s = ant[s];
}
s = D;
while(ant[s])
{
F[ant[s]][s] += fmin;
F[s][ant[s]] -= fmin;
s = ant[s];
}
cost += d[D]*fmin;
}
g<<cost<<"\n";
f.close();
g.close();
return 0;
}