문제 링크
- http://icpc.me/19619
문제 출처
- 2020 APIO 2번
사용 알고리즘
- MST
- HLD
시간복잡도
- HLD + Segment Tree: $O(M \log M + Q \log^2 N)$
- Sparse Table: $O(M \log M + Q \log N)$
풀이
MST는 다음과 같은 성질을 갖고 있습니다.
- 경로 위에 있는 가중치의 최댓값을 최소화
이 문제에서 요구하는 쿼리와 MST의 성질이 잘 맞는 것 같으니 MST 위주로 풀이를 생각해봅시다.
두 자동차가 위치를 교환할 수 있는 경우에 그래프가 어떤 형태인지, 그리고 어떤 방식으로 이동하는지 알아봅시다.
- degree가 3 이상인 정점 x가 존재
- 첫 번째 차가 x까지 이동한 다음, 한 칸 더 가서 주차함
- 두 번째 차가 x까지 이동한 다음, 도착 지점으로 이동
- 주차한 상태였던 첫 번째 차가 다시 출발해서 도착 지점으로 이동
- 사이클이 존재
- 두 차 모두 사이클로 들어간 뒤, 사이클을 돌면서 위치를 교환
두 가지 경우에 모두 속하지 않는 그래프는 선형 그래프밖에 없습니다. 즉, 선형 그래프가 아니라면 항상 두 자동차가 위치를 교환할 수 있습니다.
두 자동차가 위치를 교환할 수 있는 상태를 나타내는 새로운 정점 $X$를 만듭시다. 두 자동차 $U, V$가 위치를 교환하는 비용은 max($U$에서 $X$로 이동하는 비용 + $V$에서 $X$로 이동하는 비용, $U$에서 $V$로 이동하는 비용)이 됩니다.
$X$를 포함해서 MST를 구축하면 Sparse Table이나 HLD+Segment Tree를 이용해서 문제를 풀 수 있습니다.
두 자동차가 위치를 교환할 수 있는 조건은 (1) degree가 3 이상인 정점 x에 도달함, (2) 사이클에 도달함, 총 2가지입니다.
원래 주어진 그래프에서 크루스칼 알고리즘을 이용해 MST를 만들어주면서
- 차수가 3 이상이 된 정점 $Y$에 대해 $X$와 $Y$를 잇는 간선을 추가해주고
- 어떤 간선이 잇는 두 정점 $Y_1, Y_2$가 이미 같은 컴포넌트에 속한 경우, $X$와 $Y_1$을 잇는 간선과 $X$와 $Y_2$를 잇는 간선을 각각 추가해주면 됩니다.
전체 코드
1 |
|