关于dfs-KM算法与bfs-KM算法

P1559 运动员最佳匹配问题

dfs 更好写,bfs 复杂度保证
by Coros_Trusds @ 2022-08-04 18:06:19


dfs好像是 $O(n^{2}m)$,bfs 是 $O(n^{3})$,也就是边多的时候bfs快,边少的时候dfs快
by Aisaka_Taiga @ 2022-08-04 18:09:25


@[yi_fan0305](/user/715213) dfs-KM 和 bfs-KM 都是 $O(n^3)$ 复杂度的
by 智子 @ 2022-08-04 18:38:23


@[yi_fan0305](/user/715213) 这是 dfs-KM AC 洛谷模板题(数据较强)的 AC 记录和代码 <https://www.luogu.com.cn/record/72937743> ```cpp #include<bits/stdc++.h> using namespace std; const int MAXN = 500 + 5; const long long INF = 1e18; long long e[MAXN][MAXN], la[MAXN], lb[MAXN], slack[MAXN]; int match[MAXN], last[MAXN]; bool va[MAXN], vb[MAXN]; int n, m; bool dfs(int u, int fa) { va[u] = true; for(int v = 1; v <= n; v++) { if(vb[v]) continue; if(la[u] + lb[v] == e[u][v]) { vb[v] = true; last[v] = fa; if(!match[v] || dfs(match[v], v)) { match[v] = u; return true; } } else if(slack[v] > la[u] + lb[v] - e[u][v]) { slack[v] = la[u] + lb[v] - e[u][v]; last[v] = fa; } } return false; } long long KM() { for(int i = 1; i <= n; i++) { la[i] = -INF; lb[i] = 0; for(int j = 1; j <= n; j++) { la[i] = max(la[i], e[i][j]); } } for(int i = 1; i <= n; i++) { fill(va + 1, va + n + 1, false); fill(vb + 1, vb + n + 1, false); fill(slack + 1, slack + n + 1, INF); int st = 0; match[st] = i; while(match[st]) { if(dfs(match[st], st)) break; long long delta = INF; for(int j = 1; j <= n; j++) { if(!vb[j] && delta > slack[j]) { delta = slack[j]; st = j; } } for(int j = 1; j <= n; j++) { if(va[j]) la[j] -= delta; if(vb[j]) lb[j] += delta; else slack[j] -= delta; } vb[st] = true; } while(st) { match[st] = match[last[st]]; st = last[st]; } } long long ans = 0; for(int i = 1; i <= n; i++) { ans += e[match[i]][i]; } return ans; } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { e[i][j] = -INF; } } for(int i = 1; i <= m; i++) { int u, v; long long w; scanf("%d%d%lld", &u, &v, &w); e[u][v] = max(e[u][v], w); } printf("%lld\n", KM()); for(int i = 1; i <= n; i++) { printf("%d ", match[i]); } printf("\n"); return 0; } ```
by 智子 @ 2022-08-04 18:39:47


@[Coros_Trusds](/user/430409) 这两个写法都有复杂度保证
by 智子 @ 2022-08-04 18:40:07


@[yi_fan0305](/user/715213) dfs 写法确实更好些一些
by 智子 @ 2022-08-04 18:40:41


@[Coros_Trusds](/user/430409) <https://www.luogu.com.cn/record/72656301> <https://www.luogu.com.cn/record/72937743> 上为 BFS 写法,下为 DFS 写法,两种写法的运行时间几乎没有区别
by 智子 @ 2022-08-04 18:42:07


@[Coros_Trusds](/user/430409) 两种写法的复杂度相同,常数也基本相同
by 智子 @ 2022-08-04 18:43:02


@[智子](/user/132435) ? dfs 可以过模板题了?之前我写的时候 T 了。。
by Coros_Trusds @ 2022-08-04 18:55:30


|