特殊图上的加边最大流
加边最大流问题,边容量均为 1 且无重边,流量在 \(O(n)\) 级别,边数在 \(n^2\) 级别。
每次跑一遍 Dinic,复杂度 \(O(m^2n^{2/3})=O(n^{4+2/3})\)。
每次使用 FF 增广,复杂度 \(O(n^4)\)。
\(s\to t\) 的增广只有 \(O(n)\) 次。维护当前源点访问不到的点,在这些点中 BFS 增广,相当于分担了一部分的 BFS。复杂度 \(O(n^3)\)。
vis=0 \(\to\) vis=1 的变化只有 \(O(n^2)\),bitset 维护即可做到 \(O(\dfrac{n^3}{w})\)。
bitset<6410> vis, edg[6410]; int bef[6410];
bool bfst(int s) {
queue<int> q; q.push(s);
while (q.size()) {
int u = q.front(); q.pop();
bitset<6410> to = edg[u] & vis;
for (int v = to._Find_first(); v <= t; v = to._Find_first()) {
vis[v] = 0; to[v] = 0; bef[v] = u; q.push(v);
}
}
return !vis[t];
}
bool relax(int u, int v) {
edg[u][v] = 1;
if (!vis[u] && vis[v]) {
if (bfst(u)) {
for (int i = t; i != s; i = bef[i]) edg[bef[i]][i] = 0, edg[i][bef[i]] = 1;
vis.set(); vis[s] = 0; bfst(s); return 1;
}
}
return 0;
}

浙公网安备 33010602011771号