Pagini recente » Cod sursa (job #1446052) | Cod sursa (job #1444482) | Cod sursa (job #1936147) | Cod sursa (job #573600) | Cod sursa (job #3040694)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
ifstream in ("fmcm.in");
ofstream out ("fmcm.out");
const int max_size = 351, INF = 1e9 + 1;
struct str{
int nod, cost;
bool operator < (const str & aux) const
{
return cost > aux.cost;
}
};
int cap[max_size][max_size], cost[max_size][max_size], pr[max_size], d[max_size], aux[max_size], t[max_size], n;
vector <int> mc[max_size];
void bf (int s)
{
for (int i = 1; i <= n; i++)
{
aux[i] = INF;
}
aux[s] = 0;
queue <int> q;
q.push(s);
while (!q.empty())
{
int nod = q.front();
q.pop();
d[nod] = 0;
for (auto f : mc[nod])
{
if (aux[nod] + cost[nod][f] < aux[f] && cap[nod][f] > 0)
{
aux[f] = aux[nod] + cost[nod][f];
if (d[f] == 0)
{
d[f] = 1;
q.push(f);
}
}
}
}
}
bool djk (int s, int dest)
{
for (int i = 1; i <= n; i++)
{
d[i] = INF;
t[i] = 0;
pr[i] = INF;
}
d[s] = 0;
pr[s] = 0;
priority_queue <str> pq;
pq.push({s, 0});
while (!pq.empty())
{
int nod = pq.top().nod, val = pq.top().cost;
pq.pop();
if (val != d[nod])
{
continue;
}
for (auto f : mc[nod])
{
if (cap[nod][f] > 0 && d[nod] + cost[nod][f] + aux[nod] - aux[f] < d[f])
{
d[f] = d[nod] + cost[nod][f] + aux[nod] - aux[f];
pr[f] = pr[nod] + cost[nod][f];
t[f] = nod;
pq.push({f, d[f]});
}
}
}
return (d[dest] != INF);
}
int main ()
{
int m, src, dest;
in >> n >> m >> src >> dest;
while (m--)
{
int x, y, c, pret;
in >> x >> y >> c >> pret;
mc[x].push_back(y);
mc[y].push_back(x);
cap[x][y] = c;
cost[x][y] = pret;
cost[y][x] = -pret;
}
bf(src);
int ans = 0;
while (djk(src, dest))
{
//cout << "*";
int nod = dest, mn = INF;
while (nod != src)
{
mn = min(mn, cap[t[nod]][nod]);
nod = t[nod];
}
if (mn <= 0)
{
continue;
}
ans += mn * pr[dest];
nod = dest;
while (nod != src)
{
cap[t[nod]][nod] -= mn;
cap[nod][t[nod]] += mn;
nod = t[nod];
}
for (int i = 1; i <= n; i++)
{
aux[i] = d[i];
}
}
out << ans;
in.close();
out.close();
return 0;
}