dijkstra-1504

N은 정점 개수다. (1,N)까지의 최단 거리를 구해야 한다. 단, 입력받은 2개의 정점을 꼭 통과해야한다. 만약 최단경로가 없다면 -1을 출력한다.

Solution

fail

최단경로면서, 가중치 값이 양인 것을 보고 다익스트라를 떠올렸다. 이 때, 2개의 정점을 꼭 통과해야 했다. 이에 대한 해결책으로

// A, B : 통과해야 할 2개의 정점
dijkstra(1,N);
if(dist[A] < dist[B]) 최단 거리 경로 : 1-A-B-N
else                                    최단 거리 경로 : 1-B-A-N

위와 같이 단순하게 생각했다.

다익스트라로 최단경로 구할 시, 출발지는 0으로 초기화 후, 도착지까지 최단경로를 구한다. 즉, 1-A VS 1-B 에서 A가 더 최단거리일지라도 A-B-N 보다 B-A-N이 더 최단거리일 수 있다.

success

출발지에 따라 사용할 수 있는 간선이 달라지기 때문에 모든 출발지-도착지에 대해 비용을 비교해야한다.

shortestCost = min(dijkstra(1,A) + dijkstra(A,B) + dijkstra(B,N),
        dijkstra(1,B) + dijkstra(B,A) + dijkstra(A,N))

fail

위와 비슷한 맥락이다. 최단경로는 출발지(cost=0)에 따라 달라진다. 두번째 경로(ex. A-B)에 대한 최단경로 구할 때, 첫번째 경로(ex. 1-A)의 각 정점에 대한 최단경로(dist[vertex])를 초기화 하지 않았다. 출발지가 달라졌을 때 모든 최단경로가 달라질 것이라고 생각하지 못했다.

이외에도 최단경로를 가진 정점을 먼저 방문하기 위한 우선순위 큐도 초기화해야한다.

Issue

  • 방향성이 없는 그래프가 주어졌다 라는 내용을 보고 양방향 그래프라는 걸 떠올렸어야 했는데 그러지 못했다.

Summary

그래프에서 각 정점에 대한 최단경로는 같은 그래프 일지라도 시작점에 따라 달라진다. 따라서, 시작점이 달라질 때마다 각 정점에 대한 최단경로, 최단경로를 가진 정점을 먼저 파악하기 위한 우선순위 큐는 모두 초기화해야한다.

Last updated

Was this helpful?