Учитывая общее дерево, я хочу расстояние между двумя узлами v
и w
.Определить расстояние между двумя случайными узлами в дереве
Википедия states the following:
Вычисление низких общих предков может быть полезным, например, как часть процедуры для определения расстояния между парами узлов в дереве: расстояние от v до ж может быть вычисляется как расстояние от корня до v, плюс расстояние от корня до w, минус в два раза больше расстояния от корня до самого низкого общего предка.
Скажем d(x)
обозначает расстояние от узла x
от корня, который мы установили в 1
. d(x,y)
обозначает расстояние между двумя вершинами x
и y
. lca(x,y)
обозначает наименьший общий предок пары вершин x
и y
.
Таким образом, если у нас есть 4
и 8
, lca(4,8) = 2
поэтому, согласно приведенному выше описанию, d(4,8) = d(4) + d(8) - 2 * d(lca(4,8)) = 2 + 3 - 2 * 1 = 3
. Отлично, это сработало!
Однако дело было указано выше, кажется, не в состоянии для вершины пары (8,3)
(lca(8,3) = 2
) d(8,3) = d(8) + d(3) - 2 * d(2) = 3 + 1 - 2 * 1 = 2.
Это неверно, однако, расстояние d(8,3) = 4
, как можно видеть на графике. Кажется, что алгоритм терпит неудачу для всего, что пересекает определенный корень.
Что мне не хватает?
У вас есть два 2-х. Это намеренно? – John
Не было, я обновил фотографию! – Sirupsen
lca (8,3) = 1 не 2! –