Условие, которое вы предлагаете, когда критическое значение является правильным, я думаю.Но нет необходимости фактически находить цикл и проверять каждый его край.
Алгоритм Kruskal добавляет ребра в порядке возрастания веса, поэтому последовательность кромочных добавок может быть разбита на блоки с равными весами. Внутри каждого блока с равным весом, если имеется более одного края, соединяющего одни и те же два компонента, тогда все эти ребра являются некритичными, поскольку вместо них можно выбрать любой из других ребер. (Я говорю, что они все некритично, потому что на самом деле мы не задали конкретный MST как часть ввода - если бы мы были тогда, это идентифицировало бы конкретный край для вызова некритического. Край, который на самом деле выбирает Крускал просто артефакт начального заказа на ребра или как была выполнена сортировка).
Но этого недостаточно: возможно, после добавления всех краев веса 4 или менее в MST мы обнаружим, что есть 3 весовых коэффициента, 5 ребер, соединяющих пары компонентов (1, 2), (2, 3) и (1, 3). Хотя ни одна из пар компонентов не соединена более чем с одним из этих трех ребер, нам нужно только (любое) из них 2 - использование всех 3 создаст цикл.
Для каждого блока с равным весом, имеющего вес, обозначаемый w, нам действительно нужно (концептуально) создать новый график, в котором каждый компонент MST до сих пор (т. Е. Используя ребра, имеющие вес < w), является вершина, и существует ребро между двумя вершинами, когда между этими компонентами имеется ребро веса-w. (Это может привести к многократным ребрам.) Затем мы запускаем DFS на каждом компоненте этого графика, чтобы найти любые циклы, и отмечаем каждое ребро, принадлежащее такому циклу, как некритическое. DFS принимает время O (nEdges), поэтому сумма времени DFS для каждого блока (сумма размеров которого равна E) будет O (E).
Обратите внимание, что алгоритм Крускала занимает время O (Elog E), а не O (E), как вы, кажется, подразумеваете, хотя такие люди, как Бернард Чазелль, приблизились к линейной конструкции MST, ТТБОМК пока еще нет ! :)
Я не понял, почему сумма dfs раз будет равна O (E). Считайте этот график http://i.imgbox.com/RdXix9x4.png Не так ли, что dfs будет пересекать 3, 5, 7, 9, 11 вершин каждые 3-й шаг алгоритма Крускаля соответственно? Это приводит к, по крайней мере, O (V^2) дополнительному времени для разреженных графиков (я не уверен, как генерировать E << V^2 график для O (EV), но, возможно, я думаю). На плотных графах dfs будем называть O (E - (V-1)) ~ O (V^2) раз, и его стоимость будет равна O (V), поэтому общая дополнительная сложность будет O (V^3) который не является O (ElogE) вообще. Mb Я где-то ошибся? – Ralor
Вот плохой тест для плотных графиков http://i.imgbox.com/hbWvMRmg.png Извините за некропостинг, хотя)) В настоящее время я ищу решение ElogV (на самом деле его спрашивают в книге Седжуика) – Ralor
@Ralor : My O (E) претензия на сумму DFS раз немного ошибочна, так как вам также нужно время для поддержания «графа компонентов» (график, в котором каждая вершина является компонентом MST-so-far, и каждое ребро является краем веса-w в исходном графе), и это занимает как минимум обратное время Аккермана за операцию. (Обработка каждого блока граней с равным весом в исходном графе приводит к объединению некоторых подмножеств вершин в графе компонентов и добавлению нового подмножества ребер.) После этого обратите внимание, что каждое ребро в исходном графе будет посещаемый DFS ровно один раз. –