Сочетание кратчайшего пути и минимального остовного дерева

0

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

 G
 |2 
 H      A
 |1     |6      
 F      ------B
 |1           | 7
 E -----D-----C
    2      8    

Существует также край между A и E с 2 весом, но я не мог его показать.

Теперь, Прежде всего, мне нужно найти кратчайший путь между A и E (я должен сделать это из-за своего приложения), который является AEDC, а затем подключить весь график с минимальным охватом. Есть ли кто-нибудь, кто поможет мне дать какую-то подсказку? Извините за плохой английский, это не мой родной язык

Теги:
algorithm
shortest-path

1 ответ

2

Просто MST

Если вы просто хотите MST, это просто включает в себя запуск алгоритма Kruskal (см. Ниже) или алгоритм Prim:

  1. Инициализируйте дерево с единственной вершиной, выбранной произвольно из графика.
  2. Вырастите дерево одним краем: из ребер, которые соединяют дерево с вершинами еще не на дереве, найдите край минимального веса и перенесите его в дерево.
  3. Повторите шаг 2 (пока все вершины не будут в дереве).

Это не связано с получением кратчайших путей между вершинами. Фактически, это не обязательно будет включать в себя кратчайшие пути. Рассматривать:

  A
1 |\
  B \
1 |  \ 2
  C   \
1 |    \
  D-----E
     1

Самый короткий путь между A и E равен 2 (только непосредственно от A до E), но MST (ABCDE) не включает этот край.

"MST", включая несколько кратчайших путей

Если вы хотите найти MST, включая несколько кратчайших путей, это самая интересная проблема.

Это можно решить, выполнив алгоритм Крускаля с небольшим изменением.

Выведено из Википедии:

  • Создайте лес F (набор деревьев), где каждая вершина в графе является отдельным деревом, исключая вершины из кратчайшего пути.
  • Добавьте кратчайший путь как одно дерево в лес
  • Создайте множество S, содержащее все ребра в графе, исключая ребра из кратчайшего пути
  • В то время как S непусто и F еще не охватывает
    • Удалите край с минимальным весом от S
    • Если это кромка соединяет два разных дерева, добавьте их в лес, объединив два дерева в одно дерево
    • В противном случае отбросить этот край

Ещё вопросы

Сообщество Overcoder
Наверх
Меню