This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub AlexanderNekrasov/Youthful-Passion-Fruit-teambook
/**
* Author: Iurii Pustovalov
* Date: ?
* Description: Min cost
* Time: O(?)
*/
struct MCMF {
struct edge {
int a, b, cap, cost;
};
vector<edge> e;
vector<vector<int>> g;
int s, t;
int n;
void init(int N, int S, int T) {
s = S, t = T, n = N;
g.resize(N);
e.clear();
}
void addedge(int a, int b, int cap, int cost) {
g[a].pbc(e.size());
e.pbc({a, b, cap, cost});
g[b].pbc(e.size());
e.pbc({b, a, 0, -cost});
}
int getcost(int k) {
int flow = 0;
int cost = 0;
while (flow < k) {
vector<int> d(n, INF);
vector<int> pr(n);
d[s] = 0;
queue<int> q;
q.push(s);
while (q.size()) {
int v = q.front();
q.pop();
for (int i : g[v]) {
int u = e[i].b;
if (e[i].cap && d[u] > d[v] + e[i].cost) {
d[u] = d[v] + e[i].cost;
q.push(u);
pr[u] = i;
}
}
}
if (d[t] == INF) return INF;
int gf = k - flow;
int v = t;
while (v != s) {
int id = pr[v];
chkmin(gf, e[id].cap);
v = e[id].a;
}
v = t;
while (v != s) {
int id = pr[v];
e[id].cap -= gf;
e[id ^ 1].cap += gf;
cost += e[id].cost * gf;
v = e[id].a;
}
flow += gf;
}
return cost;
}
};
#line 1 "graph/MCMF.cpp"
/**
* Author: Iurii Pustovalov
* Date: ?
* Description: Min cost
* Time: O(?)
*/
struct MCMF {
struct edge {
int a, b, cap, cost;
};
vector<edge> e;
vector<vector<int>> g;
int s, t;
int n;
void init(int N, int S, int T) {
s = S, t = T, n = N;
g.resize(N);
e.clear();
}
void addedge(int a, int b, int cap, int cost) {
g[a].pbc(e.size());
e.pbc({a, b, cap, cost});
g[b].pbc(e.size());
e.pbc({b, a, 0, -cost});
}
int getcost(int k) {
int flow = 0;
int cost = 0;
while (flow < k) {
vector<int> d(n, INF);
vector<int> pr(n);
d[s] = 0;
queue<int> q;
q.push(s);
while (q.size()) {
int v = q.front();
q.pop();
for (int i : g[v]) {
int u = e[i].b;
if (e[i].cap && d[u] > d[v] + e[i].cost) {
d[u] = d[v] + e[i].cost;
q.push(u);
pr[u] = i;
}
}
}
if (d[t] == INF) return INF;
int gf = k - flow;
int v = t;
while (v != s) {
int id = pr[v];
chkmin(gf, e[id].cap);
v = e[id].a;
}
v = t;
while (v != s) {
int id = pr[v];
e[id].cap -= gf;
e[id ^ 1].cap += gf;
cost += e[id].cost * gf;
v = e[id].a;
}
flow += gf;
}
return cost;
}
};