Лабиринт Кошмаров

Автор задачи: Даниил Орешников, разработчик: Степан Мишанин

Если говорить более формально, то в задаче от нас требуется найти гамильтонов цикл в дереве, в которое добавили ребра между всеми вершинами на расстоянии не больше трёх. Очевидно, что явно построить такой граф, дополнив дерево ребрами мы не можем, ведь в худшем случае такой граф будет полным, — но для решения это и не потребуется, просто в дальнейшем будет считать, что из текущей вершины нашего дерева можно переместиться в любую вершину на расстоянии не больше трёх.

Покажем теперь, как можно в нашем дереве найти гамильтонов путь, начинающийся в корне и заканчивающийся в одном из его детей. Решать эту задачу будем рекурсивно. Пусть сейчас мы рассматриваем вершину $$$v$$$, у которой имеется $$$k$$$ детей $$$u_1, u_2, u_3, ... u_k$$$. Будем по очереди рассматривать всех её детей, тогда у нас возможны два случая:

С помощью описанного способа найдем гамильтонов путь в нашем дереве. Так как он завершится в каком-то из детей корня, нам остаётся только переместиться из этого ребёнка в корень и мы получим требуемый в задаче цикл.