搜索の进阶

Stage1 前言

众所周知搜索不只是dfsbfs那么简单。

还有 meet-in-the-middleA*,ID-dfs,IDA* ……

所以本题单就收录和整理了一些这样的搜索题。

本题单会持续更新。 简介部分也会在后续加上更多的题目说明

Stage2 :迭代加深

简单来说,迭代加深是固定搜索树的层数。一层一层增加着搜索树来寻找答案的算法(和BFS有本质的区别)。

一般我们在搜索树增长速度很快而且我们能确定答案在比较浅的节点的时候可以使用它

例题

这题是一个比较经典的迭代加深。

你会发现题目中 m 的值不会太大,大概在10左右。

而且这个时候每次要枚举两个数的和。所以搜索树增长也很快。

本题也要求

只需要输出任意一个解即可

所以很自然地可以想到迭代加深。

练习题

Stage3 meet in the middle

对于一般的搜索算法,我们一般是从一个初始状态开始搜索,直到找到结果。

meet in the middle从初态终态出发各搜索一半状态,让搜索树在中间相遇,这样可以有效减少搜索的深度。

例题

P4799 [CEOI2015 Day2]世界冰球锦标赛

嗯,这题虽然是紫题,不过稍微想一下也可以想出来折半搜索(meet in the middle)的做法。

因为它的 初态终态都十分明确。

那么分成两半搜,可以得到两个序列(长都是\frac{n}{2}),把第一个排序,然后用第二个的结果,在第一个中二分就好了。

(你看,学会这些搜索可以水好多紫题呢)。

练习题

(P3067 和 SP11469 是双倍经验(基本一样))

Stage4 A*

A*算法是一种有序搜索算法。

它会有一个估价函数

也就是对于一个任意状态。它会估计出这个状态到目标的代价。

而A*算法有点像 heap-dijkstra

它也是维护一个堆,只不过是每次取出估价函数值最小的来扩展。

不过复杂度较劣,建议使用 IDA*。

练习题:

upd-2022.1.27 :P4467 数据被加强,卡掉了时间复杂度不正确的A*做法,详情见 SF的帖子。

然后这里有另外的一道 k 短路,也撤下了A*的题解并加强数据。

不过如果你想练习A*的话可以尝试Subtask0(原版数据)。

详见: SF的另一个帖子。

如果对 k 短路相关问题感兴趣,可以看 dreamoon 的zhihu。

如果说你要更深入些,请私信我或者发邮件,我会给你 dreamoon 2021年国庆在某个地方讲课的稿件。

Stage5 IDA*

IDA ,顾名思义 `ID-A`

它的本质就是A*加上了迭代加深的思想。

而且比A*好写!!

练习题

(嗯你会发现IDA*似乎在之前的好多地方都有)

(也许因为它是终极优化版吧233)

Extra Stage

upd on 2021/4/27:changed description

upd on 2021/4/27:add CF1006F

upd on 2022/1/27:P4467's new data has been add to hack A*,So I change something in this training.


  1. UVA529 - Addition Chains
  2. P1189 - [COI 2001] SEARCH
  3. SP7579 - YOKOF - Power Calculus
  4. UVA1343 - 旋转游戏 The Rotation Game
  5. UVA11212 - 编辑书稿 Editing a Book
  6. SP4580 - ABCDEF - ABCDEF
  7. P5691 - [NOI2001] 方程的解数
  8. SP11469 - SUBSET - Balanced Cow Subsets
  9. P3067 - [USACO12OPEN] Balanced Cow Subsets G
  10. P4799 - [CEOI 2015] 世界冰球锦标赛 (Day2)
  11. P1379 - 八数码难题
  12. P2901 - [USACO08MAR] Cow Jogging G
  13. P2324 - [SCOI2005] 骑士精神
  14. UVA1603 - 破坏正方形 Square Destroyer
  15. P4467 - [SCOI2007] k短路
  16. CF1006F - Xor-Paths