Две структуры: набор и список.
В наборе вы сохраняете уже посещенные узлы. Это предотвращает вас от следующих циклов.
Список состоит из объектов, содержащих: (1) узел и (2) указатель на узел, который его нашел.
Начиная с начального узла, добавьте его в набор, добавьте его в список с нулевой обратной ссылкой, а затем добавьте все узлы, которых он может достичь, в список с обратными ссылками на индекс 0 в списке ( начальный узел).
Затем для каждого элемента в списке, вплоть до достижения конца, выполните следующее:
- , если он уже есть в наборе, пропустите его (вы уже посетили его) и перейдите к следующему элементу в списке.
- в противном случае добавьте его в набор и добавьте все узлы, которых он может достичь, в список с обратными ссылками на индекс, который вы просматриваете, в конец списка. Затем перейдите к следующему указателю в списке и повторите.
Если в любой момент вы достигнете конечного узла (оптимально, когда вы добавляете его в список, а не посещаете его в списке), отследите обратные ссылки на начальный узел и инвертируйте путь.
Пример:
Даны узлы от 0 до 3, где
узел0 -> узел1
узел0 -> узел2
узел1 -> узел2
узел2 -> узел3
и node0 это START, а node3 это END
SET = {}
СПИСОК = []
Шаг 1 - добавить START:
SET = {node0}
LIST = [[node0, null]]
Шаг 2 - по индексу 0 списка - добавить достижимые узлы:
SET = {узел0, узел1, узел2}
LIST = [ [узел0, ноль] , [узел1, 0], [узел2, 0]]
Шаг 3 - в индексе 1 из LIST - добавить достижимые узлы:
узел 2 уже находится в наборе. пропустите добавление доступных узлов в СПИСОК.
SET = {узел0, узел1, узел2}
LIST = [[node0, null], [node1, 0] , [node2, 0]]
Шаг 4 - в индексе 2 LIST - добавить достижимые узлы:
SET = {узел0, узел1, узел2, узел3}
LIST = [[node0, null], [node1, 0], [node2, 0] , [node3, 2]]
Шаг 5 - достиг КОНЦА, теперь возвращаемся назад:
Узел END (узел 3), вставленный в СПИСОК, имеет обратную ссылку на индекс 2 в списке, который является узлом 2. Это обратная ссылка на индекс 0 в списке, который является node0 (START). Инвертируйте это, и вы получите кратчайший путь node0 -> node2 -> node3.