문제 링크
- http://icpc.me/10014
사용 알고리즘
- Centroid
- 트리 이진 변환
시간복잡도
- $O((N+Q) \log^2 N)$
풀이
어떤 정점에서 가장 먼 정점을 찾는 쿼리를 여러 번 수행하는 문제입니다. Centroid Decomposition을 이용하면 될 것 같다는 생각이 듭니다.
입력으로 주어진 트리 $T$의 정점 $v$와 가장 멀리 떨어져있는 정점 $u$는, Centroid Tree $C_T$에서 $v$의 조상 $p$를 따라가면서 $p$의 $C_T$ 상에서의 자손을 보면 됩니다. 이때 $C_T$의 각 정점에서는, 그 서브 트리에 속하는 정점 $x$에 대해 $(Dist(p, x), x)$를 max heap으로 저장하고 있습니다.
$u$는 $v$와 다른 서브트리에 속해야 하기 때문에, $v$의 $C_T$ 상의 조상 $p$의 자식 정점을 모두 순회해야 합니다.
만약 트리가 성게 그래프(star graph)라면 Centroid Tree의 정점의 Degree가 $N-1$이 돼서 각 쿼리가 $O(N \log^2 N)$이 됩니다. 트리를 이진 트리로 바꿔주면 자식의 개수(정점의 Degree)가 최대 3이 되므로 각 쿼리를 $O(3 \log^2 N)$에 처리할 수 있습니다.
전체 코드
1 |
|