Pagini recente » Cod sursa (job #1732725) | Cod sursa (job #2143774) | Cod sursa (job #1775070) | Cod sursa (job #724974) | Cod sursa (job #1410109)
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define N 355
#define oo 1<<30
using namespace std;
vector<int>v[N];
int tata[N], fl[N][N], cost[N][N], cap[N][N], i, db[N], dd[N], dr[N], n, x, y, co, ca, s, d, nod, m, minflow, sol;
deque<int>q;
bitset<N>inq;
priority_queue<pii, vector<pii>, greater<pii>>pq;
void bellman()
{
for(i = 1; i <= n; i++)
db[i] = oo;
db[s] = 0;
q.pb(s);
inq[s] = 1;
while(q.size())
{
nod = q.front();
q.pop_front();
inq[nod] = 0;
for(auto it : v[nod])
{
if(db[it] > db[nod] + cost[nod][it] && fl[nod][it] < cap[nod][it])
{
db[it] = db[nod] + cost[nod][it];
if(!inq[it])
{
inq[it] = 1;
q.pb(it);
}
}
}
}
}
bool dijkstra()
{
for(i = 1; i <= n; i++)
dd[i] = oo;
dd[s] = 0;
tata[s] = s;
pq.push(mp(0, s));
while(pq.size())
{
nod = pq.top().second;
if(pq.top().first>dd[nod])
continue;
pq.pop();
for(auto it : v[nod])
{
if(dd[it] > dd[nod] + cost[nod][it] + db[nod] - db[it] && fl[nod][it] < cap[nod][it])
{
dd[it] = dd[nod]+cost[nod][it] + db[nod] - db[it];
dr[it] = dr[nod] + cost[nod][it];
tata[it] = nod;
pq.push(mp(dd[it], it));
}
}
}
for(i = 1; i <= n; i++)
db[i] = dr[i];
return dd[d] != oo;
}
int main()
{
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d%d%d%d", &n, &m, &s, &d);
for(; m; m--)
{
scanf("%d%d%d%d", &x, &y, &ca, &co);
v[x].pb(y);
v[y].pb(x);
cost[x][y] = co;
cost[y][x] = -co;
cap[x][y] = ca;
}
bellman();
while(dijkstra())
{
minflow = oo;
for(x = d; x != tata[x]; x = tata[x])
minflow = min(minflow, cap[tata[x]][x] - fl[tata[x]][x]);
for(x = d; x != tata[x]; x = tata[x])
{
fl[tata[x]][x] += minflow;
fl[x][tata[x]] -= minflow;
}
sol += db[d] * minflow;
}
printf("%d\n", sol);
return 0;
}