Вы можете решить это с помощью алгоритма Дейкстры .
Настройте график так, чтобы:
Существует узел для каждой станции на маршрутном автобусе. Если два шаттла отправляются в один и тот же пункт, то эта станция получает один узел для каждого маршрута. Итак, в вашем примере есть узлы A1, D1, B1, C1, A2, C2, E2, F2 -> A2 и т. Д. Также создайте узел для каждой станции, но сделайте его независимым от маршрута, например, A, B, С и т. Д.
Если челнок движется непосредственно между двумя станциями, например, в вашем примере между А1 и D1, но не между А1 и В1, то создайте направленный край между этими двумя узлами. Вес для этого края должен быть стоимость (расстояние) между двумя станциями. Так, например, есть ребра (A1, D1) и (D1, C1)
Если два шаттла останавливаются на одной и той же станции, то создайте два направленных ребра между узлами для станции на двух маршрутах, например, создайте ребра (A1, A2) и (A2, A1). Вес для краев должен быть стоимостью для перевода.
Создание двух ребер между каждым узлом станции, специфичным для маршрута, и узлом станции, который не зависит от станции, например, создание ребер (A, A1), (A1, A), (A, A2), (A2, A ). Присвойте каждому из этих узлов стоимость, намного меньшую стоимости предыдущих ребер, например 0,01 * минимальная стоимость.
Теперь, если вы хотите путешествовать между двумя станциями, используйте алгоритм Дейкстры, чтобы найти самый дешевый путь между двумя узлами, не относящимися к маршруту.
В вашем примере, чтобы перейти от F к X, найдите путь с наименьшей стоимостью между узлами F и X. Возвращенный путь будет F -> F2 -> A2 -> A3 -> X3 -> X со средством start в F садитесь на шаттл 2, езжайте в A, переходите на маршрут 3, затем выходите на станции X.