1) Составьте список всех уникальных первых элементов кортежей.
2) Удалите все элементы, которые также отображаются в качестве второго элемента кортежа.
3) Вы будетеостаться с корнем (8 здесь).Замените первые элементы всех кортежей этим значением.
РЕДАКТИРОВАТЬ:
Более сложный подход, который будет работать с несколькими деревьями, будет следующим:
Первый, преобразуйте в родительскую таблицу поиска:
1 -> 3
3 -> 8
4 -> 6
6 -> 3
7 -> 6
10 -> 8
13 -> 14
14 -> 10
Далее выполните команду «найти родителя со сжатием пути» для каждого элемента:
1)
1 -> 3 -> 8
дает
1 -> 8
3 -> 8
4 -> 6
...
3)
3 -> 8
4)
4 -> 6 -> 3 -> 8
дает
1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 6
...
6)
6 -> 8 (already done)
7)
7 -> 6 -> 8
и т. Д.
Результат:
1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 8
...
Затем преобразуйте это обратно в список кортежей:
(8,1)(8,3)(8,4)...
Родитель поиска с алгоритмом сжатия пути равен find_set
для непересекающихся наборных лесов, например,
int find_set(int x) const
{
Element& element = get_element(x);
int& parent = element.m_parent;
if(parent != x)
{
parent = find_set(parent);
}
return parent;
}
Ключевым моментом является то, что сжатие пути помогает избежать большой работы.Например, в приведенном выше примере, когда вы выполняете поиск для 4
, вы сохраняете 6 -> 8
, что ускоряет последующие поиски, ссылающиеся на 6
.