문제 링크
- http://icpc.me/13309
문제 출처
- 2016 전국 본선 고등3
사용 알고리즘
- HLD
시간복잡도
- O(Qlog2N)
풀이
문제를 보고 HLD가 떠올라서 풀이를 구체화시킨 결과, 두 가지 풀이가 생각이 났습니다.
두 가지 풀이의 공통점은 처음에는 모든 간선의 가중치를 1로 주고, 간선을 끊는 행위는 간선의 가중치를 0으로 바꾸는 것으로 대체한다는 것 입니다.
첫 번째 방법을 먼저 설명드리겠습니다.
HLD를 두 개 만듭니다. 첫 번째 HLD는 간선을 끊을 때마다 가중치를 0으로 업데이트해주고, 두 번째 HLD는 가만히 둡니다. 쿼리는 경로 상에 있는 모든 간선의 가중치의 합을 반환하게 합니다.
u에서 v까지의 경로에 대해 두 개의 HLD 모두 쿼리를 날린 결과가 같으면 중간에 끊어진 간선이 없다는 것을 의미하므로 yes, 다르면 no입니다.
이 풀이는 HLD를 2개 사용하므로 시간이 약간 낭비됩니다. 두 번째 풀이를 소개하겠습니다.
이번에는 HLD를 하나만 쓰고, 쿼리는 덧셈 연산이 아닌 논리곱(&&) 연산으로 정의합니다. 이렇게 하면 경로 상에 있는 간선의 가중치가 모두 1인 경우에만 true를 반환하고, 하나라도 0이라면 false를 반환합니다.
이 풀이는 첫 번째 풀이에 비해 절반정도의 시간을 소모합니다.
아래 코드는 두 번째 풀이에 대한 코드입니다.
전체 코드
1 |
|