Структура данных с несвязным множеством — это структура данных, которая отслеживает набор элементов, разделенных на несколько непересекающихся (не перекрывающихся) подмножеств. Алгоритм поиска объединения — это алгоритм, который выполняет две полезные операции с такой структурой данных:
Найти: определить, в каком подмножестве находится конкретный элемент. Это можно использовать для определения того, находятся ли два элемента в одном подмножестве.
Объединение: объединить два подмножества в одно подмножество.
В этом посте мы обсудим применение структуры данных несвязанного множества. Приложение должно проверить, содержит ли данный граф цикл или нет.
Алгоритм Union-Find можно использовать для проверки того, содержит ли ненаправленный граф цикл или нет. Обратите внимание, что мы обсудили алгоритм обнаружения цикла . Это еще один метод, основанный на Union-Find . Этот метод предполагает, что граф не содержит никаких циклов.
Мы можем отслеживать подмножества в одномерном массиве, назовем его parent [].
Давайте рассмотрим следующий график:

Для каждого ребра создайте подмножества, используя обе вершины ребра. Если обе вершины находятся в одном и том же подмножестве, цикл найден.
Первоначально все слоты родительского массива инициализируются в -1 (означает, что в каждом подмножестве только один элемент).
0 1 2 -1 -1 -1
Теперь обработайте все ребра по одному.
Край 0-1: Найдите подмножества, в которых находятся вершины 0 и 1. Поскольку они находятся в разных подмножествах, мы берем их объединение. Для принятия объединения либо сделайте узел 0 родительским для узла 1, либо наоборот.
0 1 2 <----- 1 is made parent of 0 (1 is now representative of subset {0, 1}) 1 -1 -1
Край 1-2: 1 находится в подмножестве 1, а 2 — в подмножестве 2. Итак, возьмем объединение.
0 1 2 <----- 2 is made parent of 1 (2 is now representative of subset {0, 1, 2}) 1 2 -1
Ребро 0-2: 0 находится в подмножестве 2, а 2 также в подмножестве 2. Следовательно, включение этого ребра образует цикл.
Как подмножество 0 совпадает с 2?
0-> 1-> 2 // 1 является родителем 0, а 2 является родителем 1
На основании вышеприведенного объяснения ниже приведены реализации:
|
С
|
Джава
|
питон
|
Выход:
graph contains cycle
Обратите внимание, что реализация union () и find () наивна и в худшем случае занимает время O (n). Эти методы могут быть улучшены до O (Logn) с помощью объединения по рангу или высоте . Мы скоро будем обсуждать Союз по рангу в отдельном посте.
Статьи по Теме :
Союз-Найти Алгоритм | Набор 2 (объединение по рангу и сжатию пути)
Несвязанные структуры данных множества (реализация Java)
Жадные алгоритмы | Набор 2 (алгоритм минимального связующего дерева Крускала)
Проблема последовательности работы | Набор 2 (Использование несвязанного набора)
Эта статья составлена Aashish Barnwal и рецензирована командой GeeksforGeeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Обнаружение цикла в неориентированном графе с использованием BFS
- Обнаружение цикла в неориентированном графике
- Определить цикл в графе, используя степени узлов графа
- Обнаружение цикла в ориентированном графе с использованием BFS
- Определить цикл в ориентированном графике
- Кратчайший цикл в неориентированном невзвешенном графике
- Проверьте, существует ли цикл с нечетной весовой суммой в неориентированном графе
- Определить цикл в ориентированном графе, используя цвета
- Количество компонентов одного цикла в неориентированном графе
- Найти минимальный весовой цикл в неориентированном графике
- Обнаружить отрицательный цикл на графике | (Беллман Форд)
- Преобразовать неориентированный граф в ориентированный граф так, чтобы не было пути длиной больше 1
- Найти два непересекающихся хороших набора вершин в данном графе
- Клонировать неориентированный граф
- Максимально возможный край непересекающегося остовного дерева из полного графика
0.00 (0%) 0 votes