В чем разница между алгоритмом минимального остовного дерева для неориентированных и ориентированных графов?

Являются ли алгоритмы MST неориентированного графа (Прима или Крускала) общей формой алгоритма ориентированного MST (Эдмонд / Чиу)? Почему так сложно найти исходный код MST для указанного случая? Можем ли мы использовать неориентированное решение для получения MST в ориентированном графе?

Это связано со следующим: Почему нельзя ли использовать алгоритмы Прима или Крускала на ориентированном графе?


person jortiz81    schedule 16.01.2015    source источник
comment
Я отредактировал ваш вопрос, чтобы удалить вопрос о поиске хорошей библиотеки, поскольку такого рода вопросы не относятся к теме на Stack Overflow. Однако остальная часть вашего вопроса действительно интересна, поэтому я попытаюсь на нее ответить.   -  person templatetypedef    schedule 17.01.2015


Ответы (2)


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

И алгоритмы Прима, и Крускала работают благодаря свойству cut. Если G = (V, E) - граф, то для любого разреза (S, V - S) в G, если есть ребро {u, v} с наименьшей стоимостью, пересекающее этот разрез, это ребро должно принадлежать всем MST of G. К сожалению, в направленном случае это свойство неверно. Вот контрпример:

      2
  A ----> B
  |      | ^
1 |  -99 | | 1
  |      v |
  +-----> C

Здесь дерево с минимальными затратами, основанное на точке A, выглядит следующим образом:

      2
  A ----> B
          |
      -99 |
          v
          C

Однако посмотрите на разрез ({A}, {B, C}). Ребро с наименьшей стоимостью, пересекающее этот разрез, - это ребро (A, C), но это ребро не появляется ни в одной древовидной структуре с минимальной стоимостью, основанной на A .

Без свойства cut оба алгоритма Прима и Крускала терпят неудачу. Попробуйте запустить алгоритм Прима на приведенном здесь графе, начиная с узла A в качестве включенного узла. Вы добавите ребро (A, C), затем ребро (C, B), что даст субоптимальную древесину. Теперь попробуйте запустить здесь алгоритм Краскала. Сначала вы добавите край (B, C), затем добавьте край (A, C). К сожалению, на самом деле это не древовидное растение, потому что у него нет корневого узла.

Стандартный алгоритм поиска древовидных растений с минимальными затратами (Эдмондс-Чу) на самом деле, вероятно, ближе по духу к алгоритм Борувки. Алгоритм Борувки работает путем одновременного выбора для каждого узла ребра с наименьшей стоимостью, подключенного к этому узлу, и добавления его к MST-кандидату. Затем вы сжимаете все сформированные таким образом CC в отдельные узлы и повторяете этот процесс, пока не получите свое дерево.

В неориентированном случае, пока веса ребер различны, этот алгоритм никогда не будет вводить цикл (это хорошее упражнение, чтобы доказать это), но это не так в направленных алгоритмах. Приведенный выше график является хорошим примером этого - если вы попробуете это, вы выберете (A, C) из A, (C, B) из C и (B, C) из B, образуя цикл (B, C , Б). Исправление, которое использует алгоритм Эдмондса-Чу, работает путем сжатия одного из этих циклов в один узел, затем повторения этого процесса в сокращенном графе и разрыва циклов на основе результата. В этом смысле он похож на алгоритм Борувки, но с соответствующими модификациями.

Надеюсь это поможет!

person templatetypedef    schedule 16.01.2015
comment
Мой опыт показывает, что, хотя на то, чтобы разобраться, нужно время, интерпретация этих алгоритмов в прямом дуальном (линейное программирование) проливает много света на связи между ними. - person David Eisenstat; 17.01.2015
comment
Просто люблю, когда я просматриваю здесь, чтобы ответить на некоторые вопросы и найти ответ настолько хороший, что я многому научился, даже не пытаясь. К сожалению, за такой ответ обычно не набирают много голосов. Хотел бы я проголосовать несколько раз. - person Juan Lopes; 17.01.2015
comment
@DavidEisenstat Среди многих вещей, которые я никогда не изучал всесторонне, - это то, как подходить к алгоритмам с первично-двойственной точки зрения. Есть ли у вас какие-нибудь полезные ресурсы, которые я мог бы изучить, чтобы узнать о них больше? - person templatetypedef; 17.01.2015
comment
@templatetypedef Эта лекция примечания кажутся достаточно разумными, хотя они требуют некоторого владения линейным программированием. - person David Eisenstat; 17.01.2015
comment
@DavidEisenstat Спасибо, они отлично смотрятся. К счастью, у меня есть опыт в области линейного программирования (я прошел курс, где мы изучали первично-двойственные алгоритмы). Я могу попробовать проработать их и посмотреть, смогу ли я лучше справиться с ними. - person templatetypedef; 17.01.2015
comment
@templatetypedef Интересно. Спасибо за это объяснение, оно помогает лучше понять разницу. Является ли неориентированный случай более распространенным, потому что я не могу найти много реализаций для направленного случая, а тот, который я нашел, обычно неверен. - person jortiz81; 17.01.2015
comment
@ jortiz81 MST преподают гораздо больше, чем просто древообразование с минимальными затратами, и, судя по тому, что я видел, на практике они проявляются гораздо больше. Я не уверен, что это потому, что это просто более распространено, или потому, что деревья с минимальной стоимостью не так хороши. - person templatetypedef; 17.01.2015

Я нашел несколько хороших слайдов с хорошим, четким объяснение разницы с четкими цифрами и примерами

person jortiz81    schedule 20.01.2015