문제 링크
- http://icpc.me/10169
문제 출처
- 2014 KOI 고등부 4번
사용 알고리즘
- HLD
- MST
- 세그 레이지
시간복잡도
- $O(M \log M + M \log^2 N)$
풀이
일단 MST를 구합시다.
$i$번째 간선이 MST에 속하지 않는다면, $i$번째 정답은 MST의 비용과 동일합니다. MST에 속한 간선이 제거될 때 정답이 어떻게 변하는지 빠르게 찾는 것이 문제의 핵심입니다.
MST에 속한 어떤 간선 $(u, v)$를 제거하면 트리는 ($u$가 속한 컴포넌트)와 ($v$가 속한 컴포넌트)로 나뉘게 됩니다. 쪼개진 두 컴포넌트를 다시 이어줄 대체 간선, 그 중에서도 최소 비용 대체 간선을 찾는 문제로 바뀌게 됩니다.
MST에 속하지 않은 간선 $e = (a, b)$가 MST에 추가된다면, $a - (Tree\ Path) - b - e - a$ 사이클이 만들어집니다. 또한 $(Tree\ Path)$에 속한 간선 하나가 제거되면 다시 Spanning Tree가 됩니다.
그러므로 MST에 속하지 않은 간선 $(a, b)$은, MST 상의 경로 $(a, b)$ 위에 있는 간선의 대체 간선으로 사용할 수 있다는 것을 알 수 있습니다.
이제 문제가 매우 쉬워졌습니다.
MST에 속하지 않은 간선 $e = (a, b, weight)$에 대해, MST 상의 경로 $(a, b)$에 속한 모든 간선에 $weight$라는 태그를 달아줍시다. 그러면 MST에 속한 간선 $(u, v)$의 대체 간선을 찾는 것은 간선 $(u, v)$에 붙은 태그의 최솟값을 구하면 됩니다.
이 작업은 HLD와 Segment Tree + Lazy Propagation을 이용해 $O(M \log^2 N)$에 처리할 수 있습니다.
전체 코드
1 |
|