| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 
 | #include <bits/stdc++.h>
 namespace xvl_ {
 #define ll long long
 #define IMAX 1e9
 #define LMAX 1e18
 void debug() { std :: cerr << "debug" << "\n"; }
 template <typename T> inline T Max(T a, T b) { return a > b ? a : b; }
 template <typename T> inline T Min(T a, T b) { return a < b ? a : b; }
 template <typename T, typename... Args> inline T Max(T a, Args... args) { return a > Max(args...) ? a : Max(args...); }
 template <typename T, typename... Args> inline T Min(T a, Args... args) { return a < Min(args...) ? a : Min(args...); }
 }
 using namespace std;
 using namespace xvl_;
 struct Edge { ll to, r, c, cp; };
 ll n, m, s, t, ans1, ans2;
 ll dis[405], vis[405];
 bool inq[405], isz[405];
 vector <Edge> G[405];
 void Add_Edge(ll u, ll v, ll c, ll w) {
 G[u].push_back({v, c, w, (int)(G[v].size())});
 G[v].push_back({u, 0, -w, (int)(G[u].size() - 1)});
 }
 bool check(ll s, ll t) {
 queue <ll> q;
 fill(dis + 1, dis + 1 + 400, LMAX);
 dis[s] = 0, inq[s] = 1, q.push(s);
 while (!q.empty()) {
 ll cur = q.front();
 q.pop();
 inq[cur] = 0;
 for (auto v : G[cur]) {
 if (dis[cur] + v.c < dis[v.to] and v.r) {
 dis[v.to] = dis[cur] + v.c;
 if (!inq[v.to]) inq[v.to] = 1, q.push(v.to);
 }
 }
 }
 return dis[t] != LMAX;
 }
 ll aug(ll cur, ll now, ll& c) {
 ll flow = 0;
 if (cur == t) return now;
 isz[cur] = 1;
 for (ll& i = vis[cur]; i < G[cur].size(); i++) {
 Edge& v = G[cur][i];
 if (dis[v.to] != dis[cur] + v.c or isz[v.to] or !v.r) continue;
 int d = aug(v.to, Min(now - flow, v.r), c);
 v.r -= d, G[v.to][v.cp].r += d, flow += d, c += v.c * d;
 if (flow == now) break;
 }
 isz[cur] = 0;
 return flow;
 }
 int main() {
 
 
 
 
 ios :: sync_with_stdio(0);
 cin >> n >> m;
 s = 1, t = n;
 for (int i = 1; i <= m; i++) {
 ll u, v, c, w;
 cin >> u >> v >> c >> w;
 Add_Edge(u, v, c, w);
 }
 while (check(s, t)) {
 memset(vis, 0, sizeof vis);
 ans1 += aug(s, LMAX, ans2);
 }
 cout << ans1 << " " << ans2;
 return 0;
 }
 
 |