Pagini recente » Cod sursa (job #258944) | Cod sursa (job #2933428) | Cod sursa (job #1907556) | Istoria paginii utilizator/uaic_chelsau_andreas | Cod sursa (job #2278069)
/*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 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;
}