1. 可达路径问题解析
今天我们来探讨一个经典的图论问题——可达路径查找。给定一个有向图,我们需要找出从节点1到节点N的所有可能路径。这个问题在算法竞赛和实际工程中都很常见,比如网络路由规划、社交网络关系分析等场景都会用到类似的算法。
这个问题的核心在于如何高效地遍历图中的所有可能路径。我们通常会选择深度优先搜索(DFS)算法来解决,因为它天然适合处理这种"探索所有可能性"的场景。与广度优先搜索(BFS)相比,DFS在内存使用上更有优势,特别是在路径较长的情况下。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现
2.1 数据结构准备
首先我们需要选择合适的数据结构来表示图。在这个实现中,我们使用了邻接矩阵:
cpp复制vector<vector<int>> vec(N + 1, vector<int>(N + 1, 0));
邻接矩阵的优势在于:
- 可以快速查询任意两个节点之间是否有边
- 实现简单直观
- 适合稠密图的情况
不过要注意,当图比较稀疏时(边数远小于节点数的平方),邻接矩阵会浪费大量空间,这时邻接表可能是更好的选择。
2.2 核心DFS算法
下面是DFS算法的核心实现:
cpp复制void dfs(vector<vector<int>>& vec, int N, int node){
if (node == N){
res.push_back(path);
return;
}
for (int i = 1; i <= N; i++){
if (vec[node][i]){
path.push_back(i);
dfs(vec, N, i);
path.pop_back();
}
}
}
这个递归函数的工作流程是:
- 如果当前节点已经是目标节点N,就把当前路径保存到结果中
- 否则,遍历所有可能的下一节点
- 对于每个可达的节点,先把它加入当前路径,然后递归探索
- 递归返回后,把该节点从路径中移除(回溯)
注意:这里的回溯操作(path.pop_back())非常重要,它确保了在探索完一个分支后,路径能恢复到之前的状态,
