Путешествие по дереву

Автор задачи: Ильдар Гайнуллин, разработчик: Егор Юлин

Приведем конструктивное решение: построим новый граф, в котором есть все ребра $$$(a_i, b_i)$$$, и найдем в этом графе остовное дерево. Утверждается, что размер этого остовного дерева и будет ответом.

Действительно, давайте докажем этот факт:

  1. Если какие-то ребра в новом графе образуют цикл, то какие-то два соответствующих пути в исходном графе обязательно имели пересечение. Действительно, нельзя пройти по дереву по вершинам $$$v_1 \to v_2 \to \ldots \to v_k \to v_1$$$, не посетив никакое ребро дважды (так как в дереве не может быть циклов). Соответственно, ответ не может быть больше, чем величина остовного дерева в новом графе.
  2. При этом существует граф, на котором такая оценка достигается: буквально возьмем старый граф равным найденному остовному дереву в новом графе, и в нем выбранное множество путей не пересекается, так как каждый путь состоит из одного уникального ребра.

Поэтому задача сводится к поиску размера остовного дерева графа, в котором $$$(a_i, b_i)$$$ — ребра. А это можно сделать, например, с помощью обхода в глубину или в ширину.