Задача «Родословная: LCA»

Условие

В генеалогическом древе определите для двух элементов их наименьшего общего предка (Lowest Common Ancestor). Наименьшим общим предком элементов A и B является такой элемент C, что С является предком A, C является предком B, при этом глубина C является наибольшей из возможных. При этом элемент считается своим собственным предком.

Формат входных данных аналогичен предыдущей задаче

Для каждого запроса выведите наименьшего общего предка данных элементов.

Решение

  1. def ancestors(child, p_tree):
  2.     result = []
  3.     result.append(child)
  4.     while child in p_tree:
  5.         child = p_tree[child]
  6.         result.append(child)
  7.     return result
  8. p_tree = dict()
  9. n = int(input())
  10. for i in range(n - 1):
  11.     child, parent = input().split()
  12.     p_tree[child] = parent
  13. m = int(input())
  14. for i in range(m):
  15.     child_1, child_2 = input().split()
  16.     ancestors_for_1 = set(ancestors(child_1, p_tree))
  17.     for ancestor in ancestors(child_2, p_tree):
  18.         if ancestor in ancestors_for_1:
  19.             print(ancestor)
  20.             break