Pagini recente » Cod sursa (job #2280363) | Cod sursa (job #1779249) | Cod sursa (job #1700406) | Cod sursa (job #2744841) | Cod sursa (job #2823363)
#include <bits/stdc++.h>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
using ll = long long;
const ll INF = (ll)1e18 + 5;
vector<vector<int>> g;
vector<vector<int>> cost, cap;
vector<ll> d, old;
vector<int> dad;
bool Dijkstra(int n, int sink, int dest) {
vector<bool> seen(n + 1);
vector<ll> newD(n + 1);
seen[sink] = true;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
d[sink] = 0;
q.push(make_pair(d[sink], sink));
while ((int)q.size() > 0) {
int u = q.top().second, c = q.top().first;
q.pop();
if (d[u] < c)
continue;
for (int v : g[u])
if (cap[u][v]) {
int newDistance = d[u] + cost[u][v] + old[u] - old[v];
if (newDistance < d[v]) {
d[v] = newDistance;
newD[v] = newD[u] + cost[u][v];
q.push(make_pair(d[v], v));
dad[v] = u;
seen[v] = true;
}
}
}
old = newD;
return seen[dest];
}
int main() {
int n, m, sink, dest; in >> n >> m >> sink >> dest;
cost.resize(n + 1, vector<int>(n + 1)); cap.resize(n + 1, vector<int>(n + 1));
g.resize(n + 1);
d.resize(n + 1, INF);
old.resize(n + 1);
dad.resize(n + 1, -1);
for (int i = 0; i < m; i++) {
int a, b, c, y; in >> a >> b >> c >> y;
cost[a][b] = y;
cost[b][a] = -y;
cap[a][b] = c;
g[a].push_back(b);
g[b].push_back(a);
}
ll flow = 0, flowCost = 0;
while (Dijkstra(n, sink, dest)) {
ll pump = INF;
for (int u = dest; u != sink; u = dad[u])
pump = min(pump, (ll)cap[dad[u]][u]);
for (int u = dest; u != sink; u = dad[u]) {
cap[dad[u]][u] -= pump;
cap[u][dad[u]] += pump;
}
flow += pump;
flowCost += pump * old[dest];
fill(dad.begin(), dad.end(), -1);
fill(d.begin(), d.end(), INF);
}
out << flowCost << "\n";
return 0;
}