Ctrl K

Как соединить два дерева

Сложная
Даны два дерева (неориентированных). В первом n вершин с номерами от 0 до n − 1, его рёбра — список first_edges, где [a, b] означает ребро между вершинами a и b. Во втором дереве m вершин с номерами от 0 до m − 1 и рёбра second_edges. Соедините одним новым ребром какую-нибудь вершину первого дерева с какой-нибудь вершиной второго — получится одно большое дерево. Выберите концы ребра так, чтобы **диаметр** итогового дерева (число рёбер на самом длинном пути между двумя вершинами) был как можно меньше, и верните этот диаметр.
Пример 1
first_edges=[[0, 1], [1, 2]], second_edges=[[0, 1], [0, 2], [0, 3]] → 3

Соединим середину первой цепочки (вершину 1) с центром второго дерева (вершиной 0). Самый длинный путь — например, от вершины 0 первого дерева до листа второго — имеет длину 3.

Пример 2
first_edges=[], second_edges=[[0, 1]] → 2

Первое дерево — одна вершина. К какой из двух вершин второго дерева её ни присоедини, получится цепочка из трёх вершин длиной 2.

Пример 3
first_edges=[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5]], second_edges=[] → 5

Диаметр первого дерева уже 5, и новое ребро его не уменьшит. Если подвесить одиночную вершину к вершине 2 или 3, длиннее 5 путь не станет.

Ограничения
  • 1 ≤ n, m ≤ 10⁵
  • len(first_edges) == n − 1, len(second_edges) == m − 1
  • 0 ≤ номера вершин первого дерева < n, второго — < m
  • Каждый список рёбер задаёт дерево
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиЖук бродит по дереву СложнаяСамый длинный поход по лесу СредняяСвязи складываются в одно дерево СредняяОткрытые комнаты от холла СредняяГонка за сокровищами у ворот Средняя
загружаем Python…
Вход
first_edges=[[0, 1], [1, 2]], second_edges=[[0, 1], [0, 2], [0, 3]]
Ожидается
3

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 61 тест на сервере, включая скрытые.