Найти все критические ребра MST

У меня этот вопрос из книги Роберта Седжвика по алгоритмам.

критический края. ребро MST, удаление которого из графика приведет к Вес MST для увеличения называется критическим краем. Показать, как найти все критические ребра в a график во времени, пропорциональный e log E. Примечание: этот вопрос предполагает, что веса ребер не обязательно различны (в противном случае все ребра в MST являются критическими).

пожалуйста, предложите алгоритм, который решает эту проблему.

один подход, который я могу придумать, делает работу вовремя E. V. Мой подход-запустить алгоритм крускала.

но всякий раз, когда мы сталкиваемся с ребром, вставка которого в MST создает цикл, и если это цикл уже содержит ребро с тем же весом ребра, тогда уже вставленное ребро не будет критическим ребром (в противном случае все остальные ребра MST являются критическими ребрами).

этот алгоритм правильный? Как я могу продлить этот алгоритм для выполнения задания во времени e log E.

2 ответов


Да, ваш алгоритм правильный. Мы можем доказать это, сравнивая выполнение алгоритма Крускала с аналогичным выполнением, где стоимость некоторого MST-ребра e изменяется на бесконечность. Пока первое исполнение не рассмотрит e, оба исполнения идентичны. После e первое выполнение имеет на один подключенный компонент меньше, чем второе. Это условие сохраняется до тех пор, пока ребро e' не считается, что во втором выполнении присоединяется к компонентам, которые будут иметь e. Поскольку edge e является единственным разница между лесами, построенными до сих пор, должна принадлежать циклу, созданному e'. После e' казни принимают одинаковые решения, и разница в лесах заключается в том, что первая казнь имеет e, а вторая-e'.

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

  • MakeVertex () - создает и возвращает новую вершину.
  • Link (u, c, v) - вершины u и v не должны быть связаны. Создает немаркированное ребро от вершины u до вершины v со стоимостью c.
  • Mark (u, v) - вершины u и v должны быть конечными точками ребра e. Маркс е.
  • Connected (u, v) - указывает, связаны ли вершины u и v.
  • FindMax (u, v) - вершины u и v должны быть соединены. Возвращает конечные точки немаркированный край на уникальном пути от u до v с максимальной стоимостью вместе с этой стоимостью. Конечные точки этого ребра задаются в том порядке, в котором они появляются на пути.

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


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

алгоритм Крускала добавляет ребра в порядке увеличения веса, поэтому последовательность добавлений ребер может быть разбита на блоки добавлений ребер равного веса. В пределах каждого блока равного веса, если существует более одного ребра, которое соединяет те же два компонента, то все эти ребра некритичны, потому что любой из вместо этого можно выбрать другие края. (Я говорю, что они все некритический, потому что нам фактически не дается конкретный MST как часть входных данных-если бы мы были тогда, это определило бы конкретное ребро для вызова некритического. Ребро, которое на самом деле выбирает Крускал, - это просто артефакт начального порядка ребер или того, как была реализована сортировка.)

но этого недостаточно: возможно, после добавления всех ребер веса 4 или менее к MST мы обнаружим, что там вес 3-5 краев, соединяя компонентные пары (1, 2), (2, 3) и (1, 3). Хотя ни одна пара компонентов не соединяется более чем 1 из этих 3 ребер, нам нужны только (любые) 2 из них-использование всех 3 создаст цикл.

для каждого блока равного веса, имеющего вес, скажем, w, что нам действительно нужно сделать ,это (концептуально) создать новый граф, в котором каждая составляющая MST до сих пор (т. е. используя ребра, имеющие вес

обратите внимание, что алгоритм Крускала занимает время O (Elog E), а не O (E), как вы, похоже, подразумеваете, хотя такие люди, как Бернард Шазелл, приблизились к линейному времени MST строительство, TTBOMK никто еще не получил там! :)