문제
백준 5250
설명
시작점과 끝점이 주어지고 어떤 최단경로 \(S\) 가 주어진다. 그리고 최단경로의 간선 각각이 사라졌을 때의 최단경로를 구해야한다.
각 간선이 사라졌을 때마다 다익스트라나 SPFA 를 사용해서 최단경로를 구해도 주어진 조건 상 아슬아슬하게 가능하다고 한다. 하지만 정해는 다음과 같을 것이다.
-
\(S\) 중 간선 하나가 사라졌다면 최단경로는 \(S\) 이외의 간선을 당연히 경유한다.
-
특정한 간선 \(K\) 을 지나는 최단경로는 시작점과 끝점 각각에서 최단경로로 이루어진 트리 를 구해서 이 둘을 \(K\) 를 이용해 이으면 된다.
- 이 경로는 \(S\) 와 일부 겹치게 되어, 시작점/끝점 각각마다 마지막으로 \(S\) 와 겹치는 지점이 존재하게 된다.
- 최단경로의 특성 상 시작점/끝점 부터 \(K\) 겹치다가 갈라지는 경우만 존재하기 때문이다. 다시말해 다시 \(S\) 로 합류하지 않는다.
- 이는 곧 사라지는 간선에 영향을 받지 않는 범위와 같다. 이를 바탕으로 효율적으로 쿼리하면 된다.
나도 위와 비슷한 발상을 했지만 한군데에서 논리적 비약을 해서 삽질을 해버렸다. 지금부터 내가 한 삽질을 기술하도록 하겠다.
삽질
위에 대해서 나는 간선이 아니라 정점을 중심으로 생각했다. 즉 1번을 \(S\) 이외의 정점을 지난다고 생각했다. 그리고 \(S\) 사이의 간선은 중간에 임시정점을 삽입해서 해결하였다.
여기까지는 괜찮다. 하지만 문제는 2번이다.
임의의 정점을 반드시 지나는 최단경로는 임의의 정점과 시작점/끝점 사이의 최단거리의 합인가?
위 명제는 적어도 나에겐 그럴듯했으나 틀렸다.
예를들어 다음과 같은 반례가 있다.
5 5 5 3
1 2 1
2 3 1
1 4 1
2 4 5
5 1 1
4
5 1 2 3
왜냐하면 최단경로 트리 상의 간선 이외의 간선으로 더 빨리 갈 수 있기 때문이다.
시간 복잡도
O(\(\mathrm{N} \log{\mathrm{M}} + \mathrm{M} \log{\mathrm{N}}\))
코드
댓글남기기