Cod sursa(job #2278070)

Utilizator UncleGrandpa925Hoang Long Vuong UncleGrandpa925 Data 7 noiembrie 2018 11:26:00
Problema Flux maxim de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
/*input
5 7 2 5
3 1 7 -1
1 4 3 0
3 4 3 -4
1 5 7 0
4 5 1 1
2 5 8 -3
2 3 4 -3
*/
#include <bits/stdc++.h>
using namespace std;
#define sp ' '
#define endl '\n'
#define fi first
#define se second
#define mp make_pair
#define __builtin_popcount __builtin_popcountll
#define int long long
#define bit(x,y) ((x>>y)&1LL)
#define loop(i,l,r) for(int i=(int)l; i<=(int)r; i++)
#define rloop(i,l,r) for(int i=(int)l; i>=(int)r; i--)

template <class T1, class T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &a) {
	return os << '(' << a.first << ", " << a.second << ')';
}
template <class T>
ostream &operator<<(ostream &os, const vector<T> &a) {
	os << '[';
	for (int i = 0; i < a.size(); i++)
		os << a[i] << (i < a.size() - 1 ? ", " : "");
	os << ']';
	return os;
}

const int N = 355, inf = 1e9;

int cost[N][N], cap[N][N];
int d[N], pot[N], par[N];

int n;

bool dijkstra (int s, int t) {
	set< pair<int, int> > q;
	q.insert({0, s});

	for (int i = 0; i < N; i++)
		d[i] = inf;
	d[s] = 0;
	while (!q.empty()) {
		int v = q.begin()->second;
		q.erase(q.begin());
		for (int u = 0; u < N; u++) {
			int w = cost[v][u] + pot[v] - pot[u];
			if (cap[v][u] && d[u] > d[v] + w) {
				q.erase({d[u], u});
				d[u] = d[v] + w;
				par[u] = v;
				q.insert({d[u], u});
			}
		}
	}

	return (d[t] < inf);
}

int mincost (int s, int t) {
	int ans = 0;
	while (dijkstra(s, t)) {
		memcpy(pot, d, sizeof(d));
		int delta = inf;
		for (int v = t; v != s; v = par[v])
			delta = min(delta, cap[par[v]][v]);
		for (int v = t; v != s; v = par[v]) {
			cap[par[v]][v] -= delta;
			cap[v][par[v]] += delta;
			ans += cost[par[v]][v] * delta;
		}
	}
	return ans;
}



signed main() {
#ifndef UncleGrandpa
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#endif
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	int m, S, T;
	cin >> n >> m >> S >> T;
	memset(cost, 127, sizeof(cost));
	while (m--) {
		int u, v, x, y;
		cin >> u >> v >> x >> y;
		cost[u][v] = y; cap[u][v] = x;
	}
	cout << mincost(S, T) << endl;
}