Approach
최단 경로의 길이를 물어보는 것에서 다익스트라 문제임을 쉽게 파악할 수 있다.
이 문제에서 눈여겨 봐야할 지점은 반드시 거쳐야하는 정점이 있다는 것이다.
잠시 기억을 더듬어서 고등학교 경우의 수 문제에서 최단거리를 구할 때, 특정한 지점을 반드시 지나는 문제를 어떻게 풀었는지를 잘 생각해보자. 아마도 특정한 지점을 기준으로 분할해서 풀었던 기억이 있을 것이다.
마찬가지로 위 문제도 특정한 지점을 기준으로 분할해서 풀어주면 된다.
두 정점을 순서대로 v1, v2라고 하고, d(a, b)를 a부터 b까지 가는데 필요한 최단 경로의 길이라고 정의하자
d(1, N) = min(d(1, v1) + d(v1, v2) + d(v2, N), d(1, v2) + d(v2, v1) + d(v1, N))이다.
이를 보장할 수 있는 이유는 한번 이동했던 간선 및 정점을 다시 방문할 수 있으므로 각각의 경로는 독립적이기 때문이다.
따라서 그리디하게 각 정점까지의 최단 경로를 더해주는 것으로 정답을 도출할 수 있게 된다.
Code