1. 题目解析与核心思路
这道题目要求我们找出图中从起点到终点的所有可达路径。在算法领域,这属于经典的图遍历问题,通常使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。不过由于需要记录所有路径,DFS的递归特性使其成为更合适的选择。
1.1 问题重述
给定一个有向无环图(DAG),以及图中的两个节点:起点和终点。我们需要编写一个算法,找出从起点到终点的所有可能路径。需要注意的是:
- 图中可能包含环(虽然题目说是DAG,但实际解法应该考虑更通用情况)
- 路径不能重复经过同一个节点(避免无限循环)
- 需要返回所有不重复的完整路径
1.2 算法选择分析
为什么选择DFS而不是BFS?主要有以下几个原因:
- 路径记录便利性:DFS在递归过程中可以自然维护当前路径栈,回溯时只需弹出节点即可
- 内存效率:BFS需要存储大量中间状态(每层可能的路径),而DFS只需要维护当前路径
- 实现简洁性:DFS的递归实现通常比BFS的迭代实现更直观
注意:虽然题目说是DAG,但实际解法应该考虑图中可能存在环的情况。因此需要在遍历时标记已访问节点,防止无限循环。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 详细实现方案
2.1 数据结构准备
首先需要将给定的图表示转换为适合遍历的数据结构。通常有两种选择:
- 邻接表:使用字典/哈希表存储每个节点的邻居列表
- 邻接矩阵:二维数组表示节点间的连接关系
对于稀疏图(大多数实际情况),邻接表更节省空间。实现如下:
python复制graph = {
0: [1, 2],
1: [3],
2: [3],
3: []
}
2.2 基础DFS实现
不考虑路径记录的基础DFS遍历:
python复制visited = set()
def dfs(node):
if node in visited:
return
visited.add(node)
print(node) # 处理当前节点
for neighbor in graph[node]:
dfs(neighbor)
2.3 完整路径记录实现
为了记录完整路
