原题链接:
https://leetcode.cn/problems/all-paths-from-source-to-target/description/
完成情况:
解题思路:
// 深度优先遍历
class Solution {
List<List<Integer>> ans; // 用来存放满足条件的路径
List<Integer> cnt; // 用来保存 dfs 过程中的节点值
// 定义深度优先搜索函数
public void dfs(int[][] graph, int node) {
// 如果当前节点是 n - 1,即目标节点,保存这条路径
if (node == graph.length - 1) {
ans.add(new ArrayList<>(cnt));
return;
}
// 遍历当前节点能到达的下一个节点
for (int index = 0; index < graph[node].length; index++) {
int nextNode = graph[node][index];
cnt.add(nextNode); // 将下一个节点加入路径
dfs(graph, nextNode); // 递归搜索下一个节点
cnt.remove(cnt.size() - 1); // 回溯,移除最后一个节点
}
}
// 定义从起点到终点的所有路径函数
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
ans = new ArrayList<>(); // 初始化存放路径的列表
cnt = new ArrayList<>(); // 初始化节点值列表
cnt.add(0); // 将起点加入节点值列表
dfs(graph, 0); // 从起点开始深度优先搜索
return ans; // 返回所有从起点到终点的路径
}
}
这段代码实现了一个深度优先遍历算法,用于查找从起点到终点的所有路径。在深度优先搜索过程中,通过递归遍历每个节点的相邻节点,并记录路径中经过的节点。当到达终点时,将当前路径保存下来。在搜索过程中,通过回溯来处理路径的添加和删除,确保正确记录和更新路径信息。
参考代码:
package 代码随想录.图论;
import java.util.ArrayList;
import java.util.List;
public class _797所有可能的路径 {
List<List<Integer>> res; //存储答案
List<Integer> tempList; //存储中间过程的节点
/**
*
* @param graph
* @return
*/
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
// graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)
res = new ArrayList<List<Integer>>();
tempList = new ArrayList<Integer>();
tempList.add(0); //从头开始遍历整个图
dfs_allPathsSourceTarget(graph,0); //数字用来表示节点序号
return res;
}
/**
*
* @param graph
* @param curNode
*/
private void dfs_allPathsSourceTarget(int[][] graph, int curNode) {
if (curNode == graph.length -1){ //当前节点已经走到结尾
res.add(new ArrayList<>(tempList));
return;
}
//正常去寻找可以匹配的节点数组中的所有元素
for (int i = 0;i<graph[curNode].length;i++){
int nextNode = graph[curNode][i];
tempList.add(nextNode);
dfs_allPathsSourceTarget(graph,nextNode); //顺着nextNode看看能不能找到可以与之接连下去的节点
tempList.remove(tempList.size() - 1); //回溯
}
}
}