Отслеживание всех возможных путей от цели до начальной точки

#java #algorithm #dictionary #graph

#java #алгоритм #словарь #График

Вопрос:

Существует представление графика Map<Integer, List<Integer>> , где ключевым значением является вершина, и у него есть список других вершин, которые мы можем получить. Карта может быть больше, а списки могут быть n size . Число 1 представляет начальную вершину, а наибольшее ключевое число в карте представляет цель.

Есть ли способ перебирать и собирать пути всех комбинаций путей, доступных от цели до начала?

Пример:

 { 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<Integer> path = new ArrayList<>();
List<Integer> nodes = Collections.singletonList(goal);
while(nodes != null amp;amp; 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] or reverse [7, 9] , который является одним из кратчайших путей

Комментарии:

1. Пожалуйста, приложите код, который вы написали, пытаясь решить вашу проблему.

Ответ №1:

Ваша цель достижима с помощью dfs из самой большой вершины. Вам нужно сохранить путь и не посещать ни одну вершину, которая уже находится в пути. Подробное объяснение здесь. Вам просто нужно перейти ArrayList<Integer>[] adjList; на Map<Integer, List<Integer>> adjList;