dfs
- dfs:搜索和遍历算法:访问V(走了这一步后发生了什么),对所有邻接V的没访问过的U递归调用dfs(U)
- 图的表示:邻接矩阵o(n2):简单,邻接表o(n+e):适合边少的图
- 城堡问题:用遍历算法染色。图已经包含在城堡数组中,不需要额外表示
- 踩方格:受步数n控制的dfs,因为是求所有路径而不是简单的遍历所以在回退时要把访问标记清空。
- 例题:
- 7-1红与黑:应用dfs,开数组check记录是否被访问过,图的边信息隐含在题目数组中
- 7-2马踏棋盘:记录路径深度,按最优的方式处理相邻接的点,记录具体路径时要注意回退错误的尝试
- 7-3棋盘问题:按行递增尝试的方法可以避免重复路径,
- 小结:dfs的关键就是找到题目隐含的图中相邻结点且用最合适的顺序去遍历他们。当要求路径的长度时,需要用深度k来控制。同时dfs可以用bool返回值来判断可行性,用int来返回可能的路径数量。当处理所有路径问题时一定要注意返回前要将状态恢复。当处理从任一点开始的dfs时,要对每个点做一次以其为起点的dfs(如果路径与顺序无关则要避免重复计算)。
- 剪枝:可行性剪枝到达不到终点,最优性剪枝必然不是最优解
- 寻路问题:1放弃大于目前最优解的路径2记录中间结果的减枝:到达相同点如果剩余的钱也相同,那么长的那条可以剪枝
搜索和状态:每个状态对应图上一个点,有边表示状态间可以转移。枚举所有的状态,
生日蛋糕:抽象成搜素问题,由题目条件多次剪枝
- 佐助和名人:类似寻路问题记录中间状态剪枝