java—回溯从目标到起点的所有可能路径

jogvjijk  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(261)

有一个图形的表示法 Map<Integer, List<Integer>> 其中键值是一个vertise,它有一个我们可以得到的其他vertise的列表。Map可能更大,列表可能更大 n size . 数字1代表开始阶段,Map上最大的键数字代表一个目标。
有没有一种方法可以循环并收集从目标到开始的所有可用路径组合的路径?
例子:

{ 2=[1], 3=[1], 4=[1], 5=[4, 2], 6=[4], 7=[1], 8=[7, 2], 9=[7, 3, 8] }

目标是9,开始是1,所以输出 List<List<Integer>> 应该是这样的:

[ [9, 7, 1], [9, 3, 1], [9, 8, 7, 1], [9, 8, 2, 1] ]

或不包括1

[ [9, 7], [9, 3], [9, 8, 7], [9, 8, 2] ]

我的方法只使用列表中的第一个元素
父节点是 Map<Integer, List<Integer>> ```
List path = new ArrayList<>();
List nodes = Collections.singletonList(goal);
while(nodes != null && nodes.size() > 0) {
if (nodes.size() > 1) {
if (nodes.get(0) != goal || nodes.get(1) != goal) {
shortestPath.add(nodes.get(0));
System.out.println(shortestPath);
}
} else {
path.add(nodes.get(0));
}
nodes = parentNodes.get(nodes.get(0));

}
Collections.reverse(path);
输出为
List<Integer> `[9, 7]` 或相反 `[7, 9]` 哪条路最短
c86crjj0

c86crjj01#

你的目标是可以实现的dfs从最大的顶点。您需要存储路径,而不是访问路径中已经存在的任何顶点。这里有详细的解释。你只需要改变 ArrayList<Integer>[] adjList;Map<Integer, List<Integer>> adjList;

相关问题