Pagini recente » Cod sursa (job #2637544) | Cod sursa (job #651126) | Cod sursa (job #450136) | Cod sursa (job #846814) | Cod sursa (job #2762743)
#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;
int main() {
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
int n, m, s, t, x, y, z, w;
cin >> n >> m >> s >> t;
vector<vector<pi>> G(n + 1);
vector<vector<int>> c(n + 1, vector<int>(n + 1));
while (m--) {
cin >> x >> y >> z >> w;
G[x].emplace_back(y, w);
G[y].emplace_back(x, -w);
c[x][y] = z;
}
int flow = 0, cost = 0;
while (1) {
auto comp = [&](pi a, pi b) {
return a.second > b.second;
};
priority_queue<pi, vector<pi>, decltype(comp)> Q(comp);
vector<int> last(n + 1, -1), dp(n + 1, 0x3F3F3F3F);
Q.emplace(s, 0);
dp[s] = 0;
while (!Q.empty()) {
int node, cost;
tie(node, cost) = Q.top();
Q.pop();
if (dp[node] == cost)
for (auto x : G[node])
if (c[node][x.first] && cost + x.second < dp[x.first]) {
last[x.first] = node;
dp[x.first] = cost + x.second;
Q.emplace(x.first, cost + x.second);
}
}
int curflow = INT_MAX;
if (last[t] == -1)
break;
for (int i = t; i != s; i = last[i])
curflow = min(curflow, c[last[i]][i]);
for (int i = t; i != s; i = last[i]) {
c[last[i]][i] -= curflow;
c[i][last[i]] += curflow;
}
cost += dp[t] * curflow;
flow += curflow;
}
cout << cost << '\n';
}