Я не уверен, относится ли «родитель» в выделенной части к объекту «defaultdict», который пользователь должен ввести
Нет. defaultdict
- это график, который вводит пользователь. parent
- это дерево, которое представляет наборы связанных компонентов графа - это любое дерево, которое соединяет все узлы из одних и тех же связанных компонентов. Существует несколько способов построить такое дерево, некоторые из которых лучше, чем другие
Например, у вас есть график, состоящий из 2 компонентов:
1--2
| |
3--4 5---6
Дерево (точнее, лес ) может быть
1 5 parent[2] = 1, parent[3] = 1, parent[4] = 3, parent[6] = 5
/ \ \ parent[1] = parent[5] = -1
2 3 6
\
4
также может быть
1 5 parent[2] = 1, parent[3] = 2, parent[4] = 3, parent[6] = 5
\ \
2 6 parent[1] = parent[5] = -1
\
3
\
4
Первая версия лучше, потому что дерево короче по высоте. На самом деле лучшее дерево для представления компонента на приведенном выше графике:
1 5
/ | \ |
2 3 4 6
Формально:
parent[u] == -1
означает, что u является root дерева. parent[u] == v
означает, что u и v принадлежат одним и тем же подключенным компонентам. Однако обратите внимание, что обратное неверно: это может быть parent[u] != v
, но u и v принадлежат одним и тем же подключенным компонентам. Почему? Потому что может случиться так, что parent[u] == w, parent[w] == v
и u и v связаны ассоциацией. - Так как определить, связаны ли два узла u и v? Вам нужно найти корни деревьев, которые содержат u и v, и если два корня одинаковы, то u и v принадлежат одному и тому же дереву, и они связаны.
- Как найти root? Поднимаясь по родительскому узлу до достижения root (у которого родительский элемент равен -1)
Существуют также некоторые приемы, позволяющие сократить высоту деревьев при сохранении его представления. Обычно высота дерева поиска объединения должна быть и может быть очень короткой, в следующем порядке: log * (N) (с log * - это итеративный журнал )