《深入浅出程序设计竞赛 进阶篇》勘误

· · 算法·理论

感谢读者阅读本书。因为作者有时候脑抽或者其他原因,本书不可避免出现一些疏漏。我们每次印刷都会尝试修正。如果你读书时遇到了一些困惑,也有可能是书确实写错了。

我们勘误时会记录第一次给提出这个错误的读者的用户名。感谢所有读者的反馈。

反馈链接:https://www.luogu.com.cn/discuss/946364

(于 2025 年 8 月更新)2024 年 9/12 月第一/二次印刷

严重错误

这类错误存在概念或者事实性错误,可能会对读者产生误导。

int main(){ memset(A, 63, sizeof(A)) ; memset(F, 63, sizeof(F)), Ans = Inf ; cin >> N >> M ; Max = (1 << N) - 1 ; for (i = 1 ; i <= M ; ++ i) scanf("%d%d%d", &a, &b, &c), A[a][b] = A[b][a] = min(c, A[a][b]) ; //注意处理重边 for (i = 0 ; i < N ; ++ i) Log[1 << i] = i ; for (i = 0 ; i < N ; ++ i) F[0][1 << i] = 0 ; for (i = 1 ; i <= Max ; ++ i){ Pre = 0 ; for (j = Sup = Max ^ i; j ; j = (j - 1) & Sup) Next[j] = Pre, Pre = j ; for (j = Pre ; j ; j = Next[j]){ Now = Log[j & (-j)] + 1, T = Inf ; for (k = 1; k <= N ; ++ k) if (1 << (k - 1) & i) T = min(T, A[Now][k]) ; D[i][j] = D[i][j ^ (j & -j)] + T ; } }//预处理新加入点集到已选点集的最小直接边权之和 for (i = 1 ; i < N ; ++ i) for (j = 1 ; j <= Max; ++ j) for (k = j ; k ; k = (k - 1) & j) F[i][j] = min(F[i][j], F[i - 1][j ^ k] + i * D[j ^ k][k]) ; for (i = 0 ; i < N ; ++ i) Ans = min(Ans, F[i][Max]) ; cout << Ans << endl ; return 0 ; }



## 中等错误

这类错误因为疏忽而出现,虽然不至于误导读者,但是可能会给读者造成迷惑,一些读者可以意识到写错了。

- P50 计算 $T(n)=2T(n/2)+O(\sqrt n)$ 的答案有误(过程正确),应当为 $O(n)$。[AstralSparkle](https://www.luogu.com.cn/user/1263338)
- P166 树上任何一个结点到根的路径上经过的重链条数不会超过路径上的轻边数减去 $1$ 存在错误,应当是重链数 $\leq$ 轻边数 $+ 1$。[xu_jh](https://www.luogu.com.cn/user/1208986)
- P295 讲解中的状态定义是 $f_{i,j,k}$ 表示前 $i$ 行,二进制表示为 $j$,放置了 $k$ 个国王的方案数。代码的 $f_{i,j,k}$ 表示前 $i$ 行放置了 $j$ 个国王,二进制表示为 $k$,无法对应。这一部分代码或者讲解可能会重新编写。[bus_man](https://www.luogu.com.cn/user/1632230)
- P305 一双木棋一题,在代码 dfs 函数中缺少花括号,代码无法编译通过。
  ```cpp
  for (int i = 1; i <= n; ++ i) {
      if (cnt[i] >= m || cnt[i] >= cnt[i - 1])
          continue; cnt[i] ++; 
      dfs(); cnt[i] --;
  }

小错误

这类错误包括错别字或者语病、笔误,不影响意思,读者不一定可以意识到这些错误。

(于 2025 年 2 月更新)2024 年 9/12 月第一/二次印刷

严重错误

这类错误存在概念或者事实性错误,可能会对读者产生误导。

中等错误

这类错误因为疏忽而出现,虽然不至于误导读者,但是可能会给读者造成迷惑,一些读者可以意识到写错了。

应当将代码中的

if (i > 1 && a[i][j] == 'F') {
    if (a[i - 1][j] == 'F') {

改为

if (a[i][j] == 'F') {
    if (i > 1 && a[i - 1][j] == 'F') {

小错误

这类错误包括错别字或者语病、笔误,不影响意思,读者不一定可以意识到这些错误。