特殊图上的加边最大流

加边最大流问题,边容量均为 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})\)

23ab-day9 紫罗兰

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;
} 
posted @ 2023-08-16 16:58  Network_Error  阅读(13)  评论(0)    收藏  举报