Pagini recente » Cod sursa (job #1959028) | Cod sursa (job #1310789) | Cod sursa (job #559280) | Cod sursa (job #1485984) | Cod sursa (job #1389600)
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define mp make_pair
#define nodv g[nod][i]
using namespace std;
ifstream is("fmcm.in");
ofstream os("fmcm.out");
int n, m, S, D, fmin, answ;
vector<int> t, d, old, real;
vector<vector<int> > g, cap, cost;
void Read();
void BF();
bool Dijkstra();
int main()
{
Read();
BF();
t = real = d = vector<int>(n + 1);
while ( Dijkstra() );
os << answ;
is.close();
os.close();
return 0;
}
bool Dijkstra()
{
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
q.push(mp(0, S));
d.assign(n + 1, INF);
d[S] = real[S] = 0;
int nod, cst;
while ( !q.empty() )
{
nod = q.top().second;
cst = q.top().first;
q.pop();
if ( cst != d[nod] || nod == D )
continue;
for ( size_t i = 0; i < g[nod].size(); ++i )
if ( cap[nod][nodv] > 0 && d[nodv] > d[nod] + cost[nod][nodv] + old[nod] - old[nodv] )
{
d[nodv] = d[nod] + cost[nod][nodv] + old[nod] - old[nodv];
real[nodv] = real[nod] + cost[nod][nodv];
t[nodv] = nod;
q.push(mp(d[nodv], nodv));
}
}
if ( d[D] == INF )
return false;
old = real;
fmin = INF;
for ( int x = D; x != S; x = t[x] )
fmin = min(fmin, cap[t[x]][x]);
for ( int x = D; x != S; x = t[x] )
{
cap[t[x]][x] -= fmin;
cap[x][t[x]] += fmin;
}
answ += fmin * real[D];
return true;
}
void BF()
{
int nod;
queue<int> q;
vector<bool> ok(n + 1);
old = vector<int>(n + 1, INF);
q.push(S);
old[S] = 0;
while ( !q.empty() )
{
nod = q.front();
q.pop();
ok[nod] = false;
for ( size_t i = 0; i < g[nod].size(); ++i )
if ( cap[nod][nodv] > 0 && old[nodv] > old[nod] + cost[nod][nodv] )
{
old[nodv] = old[nod] + cost[nod][nodv];
if ( !ok[nodv] )
{
ok[nodv] = 1;
q.push(nodv);
}
}
}
}
void Read()
{
is >> n >> m >> S >> D;
g = vector<vector<int> >(n + 1);
cap = cost = vector<vector<int> >(n + 1, vector<int>(n + 1));
int n1, n2;
while ( m-- )
{
is >> n1 >> n2;
g[n1].push_back(n2);
g[n2].push_back(n1);
is >> cap[n1][n2] >> cost[n1][n2];
cost[n2][n1] = -cost[n1][n2];
}
}