Я не верю, что ваш первоначальный алгоритм работает по той причине, о которой я упоминал в комментариях. Тем не менее, я думаю, что вы можете решить это за O (n) время и пространство, используя модифицированный DFS.
Начните с обхода графика, чтобы подсчитать, сколько всего узлов; назовите это n. Теперь выберите произвольный узел и создайте для него корень дерева. Теперь мы будем рекурсивно исследовать дерево, начиная с корня, и вычислим для каждого поддерева, сколько узлов в каждом поддереве. Это можно сделать с помощью простой рекурсии:
- Если текущий узел пуст, вернуть 0.
- В противном случае:
- Для каждого дочернего элемента вычислите количество узлов в поддереве с корнем этого дочернего элемента.
- Возвращает 1 + общее количество узлов во всех дочерних поддеревьях
В этот момент мы знаем для каждого ребра, какое разделение мы получим, удаляя это ребро, поскольку, если поддерево ниже этого ребра имеет в себе k узлов, разлив будет (k, n - k). Таким образом, вы можете найти лучший отрезок, чтобы выполнить итерацию по всем узлам и найти тот, который уравновешивает (k, n - k) наиболее равномерно.
Подсчет узлов занимает время O (n), а выполнение рекурсии посещает каждый узел и ребро не более O (1) раз, так что также требуется время O (n). Нахождение лучшего среза занимает дополнительное время O (n), а чистая продолжительность выполнения O (n). Поскольку нам нужно хранить количество узлов поддерева, нам также понадобится O (n) памяти.
Надеюсь, это поможет!