Pagini recente » Cod sursa (job #2140159) | Cod sursa (job #1029327) | Cod sursa (job #2271115) | Cod sursa (job #1840520) | Cod sursa (job #2393104)
#include <bits/stdc++.h>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
int n, m, s, d, cap[351][351], cost[351][351], f[351][351], p[351];
int vechi[351], nou[351], adev[351];
int MAX = INT_MIN, mmax, cmin;
bool inCoada[351];
vector <int> Muchii[351];
inline void bellmanFord()
{
queue <int> coada;
for (int i = 1; i <= n; ++i)
vechi[i] = 5e8;
vechi[s] = 0;
coada.push(s);
while (!coada.empty())
{
int nod = coada.front();
coada.pop();
inCoada[nod] = 0;
for (int i = 0; i < Muchii[nod].size(); ++i)
{
int vecin = Muchii[nod][i];
if (vechi[vecin] > vechi[nod] + cost[nod][vecin] && cap[nod][vecin])
{
vechi[vecin] = vechi[nod] + cost[nod][vecin];
if (!inCoada[vecin])
{
coada.push(vecin);
inCoada[vecin] = 1;
}
}
}
}
}
inline bool dijkstra()
{
for (int i = 1; i <= n; ++i)
nou[i] = adev[i] = 5e8;
nou[s] = adev[s] = 0;
priority_queue < pair <int, int> > coada;
coada.push({0, s});
while (!coada.empty())
{
pair <int, int> curr = coada.top();
coada.pop();
int nod = curr.second;
if (nou[nod] != -curr.first)
continue;
for (int i = 0; i < Muchii[nod].size(); ++i)
{
int vecin = Muchii[nod][i];
if (nou[nod] + cost[nod][vecin] + vechi[nod] - vechi[vecin] < nou[vecin] && f[nod][vecin] != cap[nod][vecin])
{
nou[vecin] = nou[nod] + cost[nod][vecin] + vechi[nod] - vechi[vecin];
adev[vecin] = adev[nod] + cost[nod][vecin];
p[vecin] = nod;
coada.push({-nou[vecin], vecin});
}
}
}
return nou[d] != 5e8;
}
inline void citire()
{
int x, y, c, z;
in >> n >> m >> s >> d;
for (int i = 1; i <= m; ++i)
{
in >> x >> y >> c >> z;
Muchii[x].push_back(y);
Muchii[y].push_back(x);
cap[x][y] = c;
cap[y][x] = 0;
cost[x][y] = z;
cost[y][x] = -z;
}
}
int main()
{
citire();
bellmanFord();
int rez = 0;
while (dijkstra())
{
int MIN = 5e8;
for (int i = d; i != s; i = p[i])
MIN = min(MIN, cap[p[i]][i] - f[p[i]][i]);
for (int i = d; i != s; i = p[i])
{
f[p[i]][i] += MIN;
f[i][p[i]] -= MIN;
}
rez += (nou[d] + vechi[d]) * MIN;
memcpy(vechi, adev, sizeof(adev));
}
out << rez;
return 0;
}