Вот еще один подход, который также работает в O(V)
.
Выберите любую вершину v1
в вашем дереве.Запустите BFS из этой вершины.Последняя вершина (v2
), которую вы пройдете, будет самой дальней вершиной из v1
.Теперь запустите другую BFS, на этот раз из вершины v2
и получите последнюю вершину v3
.
Путь от v2
до v3
- это диаметр дерева, и ваш центр лежит где-то на нем,Точнее, он находится в середине этого.Если путь имеет 2n + 1
точек, будет только 1 центр (в позиции n + 1
).Если путь имеет 2n
точек, в позициях n
и n + 1
.
будет два центра. Вы используете только 2 вызова BFS, которые выполняются в 2 * O(V)
времени.