📅  最后修改于: 2023-12-03 14:58:29.411000             🧑  作者: Mango
这是Gate CS 2014年第三次考试的第47道题目。这个问题涉及到在有向图中找到两个点之间的所有路径。在这个问题中,您需要使用Java实现一个函数,该函数将接收有向图和两个顶点,并返回所有路径。
这个问题要求我们寻找两个顶点之间的所有路径。我们可以使用深度优先搜索算法来解决此问题。我们可以首先检查两个节点之间是否存在路径。如果存在路径,则我们可以从起始节点开始使用深度优先搜索算法,并在遇到目标节点时停止搜索。
在实现深度优先搜索时,我们需要使用一个Visited []数组或HashMap或Set来跟踪已经访问过的节点,以避免形成无限循环。我们还需要使用一个路径列表来跟踪已经访问过的节点。
我们使用递归函数来实现深度优先搜索。在每次递归中,我们将当前节点添加到已访问列表中,并查找所有从该节点到目标节点的路径。然后,我们将从目标节点返回的所有路径添加到当前路径列表中,并用于查找其他路径。
下面是在Java中实现该问题的代码片段示例。此代码使用深度优先搜索算法来查找两个节点之间的所有路径。
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
Set<Integer> visited = new HashSet<>();
visited.add(0);
path.add(0);
dfs(graph, 0, res, path, visited);
return res;
}
private void dfs(int[][] graph, int node, List<List<Integer>> res, List<Integer> path, Set<Integer> visited) {
if (node == graph.length - 1) {
res.add(new ArrayList<>(path));
return;
}
for (int neighbor : graph[node]) {
if (!visited.contains(neighbor)) {
visited.add(neighbor);
path.add(neighbor);
dfs(graph, neighbor, res, path, visited);
visited.remove(neighbor);
path.remove(path.size() - 1);
}
}
}
此代码示例使用List<List
在主函数allPathsSourceTarget中,我们首先初始化visited和path列表。我们将起始节点添加到visited和path中,然后调用dfs函数来查找所有路径,并返回结果。
在dfs函数中,我们首先检查当前节点是否为目标节点。如果是,则将当前路径添加到结果列表中并返回。否则,我们遍历从当前节点可以到达的所有邻居,并在每个邻居上使用递归fn。在迭代访问完所有邻居后,我们将当前节点从visited和path列表中删除。
在这个问题中,我们使用深度优先搜索算法来查找两个节点之间的所有路径。我们使用递归函数来实现深度优先搜索,并使用Visited []数组或HashMap或Set来跟踪已访问过的节点,以避免形成无限循环。我们还使用路径列表来跟踪已经访问过的节点。