Я читаю книгу о алгоритмах («Структуры данных и алгоритмы в C++») и наткнулись на следующее упражнение:союзной Найти алгоритм и определения, принадлежит ли ребро к циклу в графе
Пример. 20. Измените
cycleDetectionDFS()
так, чтобы он мог определить, является ли конкретное ребро частью цикла в неориентированном графе.
В главе о графиках, книга читается:
Вспомним из предыдущего раздела, поиск в глубину гарантированной генерации остовного дерева, в котором нет элементов
edges
не используемыйdepthFirstSearch()
привело к циклу с другим элементомedges
. Это связано с тем, что если вершины v и у принадлежалиedges
, то край (Vu) был проигнорированdepthFirstSearch()
. Проблема возникает, когдаdepthFirstSearch()
модифицирован так, что он может обнаружить , является ли конкретный край (vu) частью цикла (см. Упражнение 20). Если такой модифицированный поиск глубины сначала применяется к каждому ребру , то общий пробег будет равен O (E (E + V)), который может превращать в O (V^4) для плотных графов. Следовательно, лучший метод должен быть найден .Задача состоит в том, чтобы определить, находятся ли две вершины в одном наборе. Два операции необходимы для выполнения этой задачи: найти множество, которому вершина v принадлежит и объединение двух множеств в одно, если вершина v принадлежит к одному из них и ж к другому. Это известно как union-find проблема.
Позже автор описывает, как объединить два набора в одно в случае преимущество перешло к функции union(edge e)
соединяет вершины в различных наборах.
Однако, я не знаю, как быстро проверить, является ли край частью цикла. Может ли кто-нибудь дать мне приблизительное объяснение такого алгоритма, связанного с вышеупомянутой проблемой объединения-поиска?