Pagini recente » Cod sursa (job #1482536) | Cod sursa (job #2186896) | Cod sursa (job #2928583) | Cod sursa (job #1934684) | Cod sursa (job #1737735)
#include <fstream>
#include <cassert>
#include <cstring>
#include <queue>
#include <vector>
#define INFI 0x3f3f3f3f
using namespace std;
#define MAXN 355
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int N, M, S, D;
int C[MAXN][MAXN], Cost[MAXN][MAXN];
vector<int> con[MAXN];
int F, FCost;
int old_d[MAXN]; char inQ[MAXN];
queue<int> Q;
int d[MAXN], real_d[MAXN], p[MAXN];
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > H;
inline bool dijkstra()
{
memset(d, 0x3f, sizeof(d));
d[S] = 0; real_d[S] = 0;
H.push(make_pair(d[S], S));
for (; !H.empty(); )
{
int cost = H.top().first, nod = H.top().second;
H.pop();
if (d[nod] != cost)
continue;
vector<int> :: iterator it;
for (it = con[nod].begin(); it != con[nod].end(); it++)
if (C[nod][*it])
{
int new_d = d[nod] + Cost[nod][*it] + old_d[nod] - old_d[*it];
if (new_d < d[*it])
{
d[*it] = new_d;
real_d[*it] = real_d[nod] + Cost[nod][*it];
p[*it] = nod;
H.push(make_pair(d[*it], *it));
}
}
}
memcpy(old_d, real_d, sizeof(d));
if (d[D] == INFI)
return false;
int Min = INFI, curCost = 0;
for (int aux = D; aux != S; aux = p[aux])
Min = min(Min, C[p[aux]][aux]),
curCost += Cost[p[aux]][aux];
F += Min;
FCost += Min * real_d[D];
for (int aux = D; aux != S; aux = p[aux])
C[p[aux]][aux] -= Min,
C[aux][p[aux]] += Min;
return true;
}
inline void bellmanFord()
{
memset(old_d, 0x3f, sizeof(old_d));
old_d[S] = 0;
for (Q.push(S), inQ[S] = 1; !Q.empty(); Q.pop())
{
vector<int> :: iterator it;
int i = Q.front();
inQ[i] = 0;
for (it = con[i].begin(); it != con[i].end(); it++)
if (C[i][*it])
{
if (old_d[i] + Cost[i][*it] >= old_d[*it])
continue;
old_d[*it] = old_d[i] + Cost[i][*it];
if (inQ[*it]) continue;
inQ[*it] = 1;
Q.push(*it);
}
}
}
int main()
{
f>>N>>M>>S>>D;
for (; M; M--)
{
int x, y;
f>>x>>y;
f>>C[x][y]>>Cost[x][y];
con[x].push_back(y);
con[y].push_back(x);
Cost[y][x] = -Cost[x][y];
}
F=FCost=0;
bellmanFord();
for (; dijkstra(); );
g<<FCost;
return 0;
}