最大流dinic:
int dep[N], Q[N];
inline bool bfs() {
memset(dep, 0, sizeof(dep)); dep[st] = 1;
int l = 0, r = 1; Q[1] = st;
while(l < r) {
int u = Q[++l];
for(int i = head[u], v; i; i = e[i].next) {
if(!dep[v = e[i].to] && e[i].z) {
Q[++r] = v;
dep[v] = dep[u] + 1;
}
}
}
return dep[ed];
}
int cur[N];
int dfs(int u, int s1) {
if(u == ed || !in) return in;
int s2 = s1;
for(int &i = cur[u]; i; i = e[i].next) {
int v = e[i].to;
if(dep[v] == dep[u] + 1 && e[i].z) {
int x = dfs(v, min(s1, e[i].z));
if(!x) dep[v] = 0;
s1-= x; e[i].z-= x; e[i^1].z+= x;
if(!s1) return s2;
}
}
return s2 - s1;
}
inline int dinic() {
int ret = 0;
while(bfs()) {
memcpy(cur, head, sizeof(cur));
ret+= dfs(st, inf);
}
return ret;
}
EK费用流:
int d[N], incf[N], pre[N], vis[N];
inline bool spfa() {
queue<int> Q;
memset(d, 0xcf, sizeof(d));
memset(vis, 0, sizeof(vis));
Q.push(st); d[st] = 0; vis[st] = 1;
incf[st] = 1<<30;
while(Q.size()) {
int x = Q.front(); Q.pop(); vis[x] = 0;
for(int i = head[x]; i; i = e[i].next) {
if(!e[i].c) continue;
int y = e[i].to;
if(d[y] < d[x] + e[i].cost) {
d[y] = d[x] + e[i].cost;
incf[y] = min(incf[x], e[i].c);
pre[y] = i;
if(!vis[y]) vis[y] = 1, Q.push(y);
}
}
}
if(d[ed] == 0xcfcfcfcf) return false;
return true;
}
int ans = 0, maxflow = 0;
inline void update() {
int x = ed;
while(x != st) {
int i = pre[x];
e[i].c-= incf[ed];
e[i^1].c+= incf[ed];
x = e[i^1].to;
}
maxflow+= incf[ed];
ans+= d[ed] * incf[ed];
}
inline void EK_cost() {while(spfa()) update();}