Минимальное количество прыжков в ориентированном графе на основе условного оператора - PullRequest
0 голосов
/ 20 марта 2020

Направленный граф G дан с вершинами V и ребрами E , представляющими железнодорожные станции и однонаправленные железнодорожные маршруты соответственно.

Поезда между парами вершин перемещаются разные номера поездов в одном направлении.

Вершины G связаны друг с другом поездами с назначенными номерами поездов.

прыжок определяется, когда пассажиру необходимо переключать поезда во время движения по графику. Пассажир должен менять поезда только в случае изменения номера поезда.

Учитывая две вершины V1 и V2 , как можно go вычислить минимальное число прыжков, необходимых для достижения V2 , начиная с V1 ?


graph

В приведенном выше примере минимальное количество прыжков между вершинами 0 и 3 равно 1.

Существует два пути от 0 до 3, это

0 -> 1 -> 2 -> 7-> 3

Hop Count 4

Количество прыжков равно 4, так как пассажир должен переключиться с поезда A на B, затем C и B снова.

и

0 -> 5 -> 6 -> 8 -> 7 -> 3

Hop Count 1

Количество прыжков равно 1, так как пассажиру нужен только один маршрут поезда, B, чтобы добраться из вершин 0 до 3

Таким образом, минимальное количество прыжков равно 1.


Примеры ввода

Создание графика ввода

enter image description here

Ввод данных для решения

enter image description here


Пример вывода

Выход - решено с количеством прыжков

0 в столбце Hop Count означает, что пункт назначения не может быть достигнут

1 Ответ

2 голосов
/ 20 марта 2020

Если предположить, что число различных trainID относительно невелико (например, 4 в вашем примере), тогда я предлагаю использовать подход с многоуровневым графом.

Пусть количество вершин равно N, количество ребер M и количество различных trainIDs K.
Давайте разделим наш граф на K графов. (graphA, graphB, ...)
graphA содержит только ребра, помеченные буквой A. и т. д.
Вес каждого ребра в каждом из графиков равен 0.
Теперь создайте ребра между этими графами.
Граница между графами представляет собой «прыжок»
grapha [i] соединяется с graphB [i], graphC [i], ...
Каждый из этих ребер имеет вес 1.
Теперь для каждого В графе запустите алгоритм кратчайшего пути Дейкстры из V1 в этом графе и прочитайте результаты из V2 во всех графах, примите минимальное значение.
Таким образом, минимальное количество результатов для запуска дижкстры для каждого графа будет вашим минимальным количеством прыжков.
Сложность памяти O(K*(N+M))
А сложность времени O(K*(((2^K)*N+M)*log(KV)))
(2 ^ K) * N обусловлена ​​тем фактом, что для каждого 1 <= i <= N вершины graphA [i], graphB [i] , ... должны быть связаны друг с другом, и это дает 2 ^ K соединений для каждого i, и (2 ^ K) * N соединений в общей сложности. <br>

Для случаев, когда K относительно мало , как 4 в вашем примере, но N и M довольно большие, этот алгоритм работает как шарм. Это не подходит для ситуации, когда K велико.

Я не уверен, понятно ли это. Скажите, если вам нужно более подробное объяснение.

РЕДАКТИРОВАТЬ: enter image description here Надеюсь, что это делает мой алгоритм более понятным.
Черные края имеют вес 0, а красные края имеют вес 1.
Используя подход со слоистыми графами, мы перевели наш специальный граф в простой взвешенный граф, поэтому мы можем просто запустить алгоритм Дейкстры на нем.
Извините за некрасивое изображение.

РЕДАКТИРОВАТЬ: Так как max K = 10 , мы хотели бы убрать 2 ^ K из нашей временной сложности. Я считаю, что это можно сделать, сделав ребра, представляющие возможные прыжки, виртуальными, вместо того, чтобы физически сохранять их в списке смежности.

...