Cod sursa(job #2762743)

Utilizator siliviuSilion Liviu siliviu Data 9 iulie 2021 14:46:50
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#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';
}