Как узнать
элементы, которые только соединяются и никогда не разъединяются, и вопросы вроде «сколько групп?», «связаны ли a и b?» или «какое ребро замыкает цикл?».
Как решать такие задачи
- Сделай каждый элемент отдельной группой: parent[x] = x.
- Напиши find(x): иди по parent, пока не дойдёшь до элемента, который сам себе родитель. Это корень.
- Чтобы соединить a и b, найди оба корня. Если они разные, сделай один корень родителем другого и уменьши число групп на одну.
- Держи деревья плоскими: в find перевешивай каждый пройденный узел прямо на корень, а меньшее дерево подвешивай под большее.
Где встречается
- Поиск объектов на картинке. OpenCV (connectedComponents) и SciPy (ndimage.label) находят связные пятна пикселей: соседние пиксели объединяют в одну группу, а потом каждой группе дают номер.
- Разбиение фото на области. Алгоритм Фельценшвальба, который есть в scikit-image, сливает соседние пиксели в области, если они похожи, и хранит области в Union-Find.