Продолжение обсуждения в комментариях.Это как проверить конкретное (сжатое) ребро, чтобы увидеть, можете ли вы присоединить новую вершину n
где-то в середине, без итерации по расстояниям.
Итак, вам нужно найти три числа: l
(расстояние от точки присоединения до левого узла рассматриваемого ребра), x
(расстояние нового узла от точки присоединения) и r
(симметрично l
.)
Очевидно, для каждого узла y
в наборе L
(левая часть дерева)расстояние до A
должно отличаться от расстояния до n
тем же номером (назовем его dl
, который должен быть равен l
+ x
).Если это не так, то для этого конкретного ребра нет решения.То же самое касается узлов в R
, с dr
и r
+ x
соответственно.
Если вышеизложенное выполняется, то у вас есть три уравнения:
l + x = dl
r + x = dr
r+l = dist(A,B)
Три уравнения, три числа.Если у этого есть решение, то вы нашли правильный край.
В худшем случае вам нужно повторить вышеупомянутое для каждого края, но я думаю, что это можно оптимизировать - проверка расстояния на L
и R
может исключить одну из частей дерева из дальнейшего поиска.Также может быть возможным получить количество узлов, даже не создавая дерево.