#include<bits/stdc++.h>
#define ll long long
// Note:
// 0 or 1-indexed are both supported
// Solve the problem of min cost max flow (or min cost K flow)
// To solve for min cost max flow, set K = big number (oo)
struct MCMF {
struct Edge {
int to, cost, cap, flow, backEdge;
};
int n;
vector<Edge> *g; // graph
int inf;
MCMF(){}
void init(int n_) {
n = n_;
g = new vector<Edge> [n+1];
inf = 2e9+9;
}
void addEdge(int u, int v, int cap, int cost) {
Edge e1 = { v, cost, cap, 0, g[v].size() };
Edge e2 = { u, -cost, 0, 0, g[u].size() };
g[u].push_back(e1);
g[v].push_back(e2);
}
pair<int, int> minCostMaxFlow(int s, int t, int K) {
int flow = 0, cost = 0;
vector<int> state(n+1), from(n+1), from_edge(n+1), d(n+1);
deque<int> q;
while (flow < K) {
// re-init values
fill(state.begin(), state.end(), 0);
fill(d.begin(), d.end(), inf);
fill(from.begin(), from.end(), -1);
state[s] = 1;
d[s] = 0;
q.clear();
q.push_back(s);
// find the shortest path in residual graph (algo: SPFA)
while(!q.empty()) {
int v = q.front();
q.pop_front();
state[v] = 0;
for (int i = 0; i < g[v].size(); i++) {
Edge &e = g[v][i];
if (e.flow >= e.cap || d[e.to] <= d[v] + e.cost)
continue;
int to = e.to;
d[to] = d[v] + e.cost;
from[to] = v;
from_edge[to] = i;
if (!state[to]) {
q.push_back(to);
state[to] = 1;
}
}
}
if (d[t] == inf) break;
// find how much can we flow through this pipe.
int it = t, addflow = K - flow;
while (it != s) {
addflow = min(addflow,
g[from[it]][from_edge[it]].cap
- g[from[it]][from_edge[it]].flow);
it = from[it];
}
// flow through this line. Adjust flow of edges.
it = t;
while (it != s) {
g[from[it]][from_edge[it]].flow += addflow;
g[it][g[from[it]][from_edge[it]].backEdge].flow -= addflow;
cost += g[from[it]][from_edge[it]].cost * addflow;
it = from[it];
}
flow += addflow;
}
return {cost,flow};
}
};