Pagini recente » Cod sursa (job #90803) | Cod sursa (job #1621201) | Cod sursa (job #968603) | Cod sursa (job #732013) | Cod sursa (job #2446621)
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define sz(x) (int)((x).size())
#define all(x) (x).begin(),(x).end()
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define eb emplace_back
typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef vector< pll > vpll;
typedef long double ld;
typedef vector< ld > vld;
const ll MOD = 1e9 + 7;
void fix(ll &x, ll MOD) {
x = (x % MOD + MOD) % MOD;
return;
}
ll lgput(ll a, ll b, ll MOD) {
ll ret = 1;
a %= MOD;
while(b) {
if(b&1) ret = ret*a % MOD;
a = a*a % MOD;
b >>= 1;
}
return ret;
}
struct f {
int a, b;
f(int _a = 0, int _b = 0) : a(_a) ,b(_b) {}
ll eval(int x) {
return 1ll*x*a + b;
}
};
const int MAXN = 355;
const int inf = 0x3f3f3f3f;
int d[MAXN];
int p[MAXN];
int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
bool inQ[MAXN];
vector< int > gr[MAXN];
bool bfs(int s, int t) {
memset(d, 0x3f, sizeof d);
d[s] = 0;
deque< int > q;
q.push_front(s);
inQ[s] = true;
while(q.size()) {
int node = q.front();
inQ[node] = false;
q.pop_front();
for(auto &x : gr[node]) {
if(cap[node][x]) {
if(d[node] + cost[node][x] < d[x]) {
if(d[x] == inf) {
d[x] = d[node] + cost[node][x];
q.push_back(x);
inQ[x] = true;
} else if(!inQ[x]) {
d[x] = d[node] + cost[node][x];
q.push_front(x);
inQ[x] = true;
}
p[x] = node;
}
}
}
}
return d[t] != inf;
}
int main() {
#ifdef BLAT
freopen("stdin", "r", stdin);
freopen("stderr", "w", stderr);
#endif
#ifdef INFOARENA
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout.precision(12);
srand(time(NULL));
int n, m, s, t;
cin >> n >> m >> s >> t;
for(int i = 1; i <= m; ++i) {
int x, y, c, z;
cin >> x >> y >> c >> z;
gr[x].emplace_back(y);
gr[y].emplace_back(x);
cap[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
int ans = 0;
while(bfs(s, t)) {
int node = t;
int minim = inf;
while(node != s) {
minim = min(minim, cap[p[node]][node]);
node = p[node];
}
node = t;
while(node != s) {
cap[p[node]][node] -= minim;
cap[node][p[node]] += minim;
node = p[node];
}
ans += minim * d[t];
}
cout << ans << '\n';
}