Problem : 거의 최단 경로
유형 : 다익스트라
문제 해석
- 최단 경로에 해당하는 경로를 피하고, 목적지에 도달하는 두번째 최단 경로를 찾아라.
문제 재해석
- 한 점에서 부터의 최단 경로를 구하는 문제이다.
다익스트라
로 해결이 가능하다.
해결 전략
- 단순히 최단 경로를 하나를 구하는 것은 쉽다.
- 하지만, 최단 경로가 여러개인 경우를 처리해 주어야 한다.
- 이것을 해결하기 위해, 도착점 부터 시작점 까리의 가중치를 역추적 해나간다.
목적지 지점까지 소비한 비용
과목적지 이전 지점 까지 오는데 소비한 비용
+목적지 이전 지점에서 목적지까지의 경로 이동 비용
을 비교한다.- 만약 두 값이 같다면, 해당 경로는 최단 경로가 된다.
설계
- 다익스트라를 통해 목적지 까지의 최단 경로 가중치를 구한다.
- BFS 를 통해 목적지부터, 시작점 까지의 가중치를 비교해보면 거슬러 올라간다.
- 만약 최단 거리에 해당되는 경로를 찾았다면, 해당 경로를 지운다.
구현
- 두가지 방법으로 구현하였다.
첫번쨰 방볍
- vector 를 이용하여 인접 리스트를 만들고, 각 정점 끼리의 가중치를 관리하는 인접 행렬을 두고 관리했다.
두번쨰 방법
- 장소의 수가 500이다. 즉, 모든 장소들끼리 연결되어 있어도
500P2
밖에 되지 않는다. - 이점을 이용하여, 도시 간의 관계를 바로 인접 행렬로 관리하고, 최단 경로의 경우 INF 값을 주어 삭제 하였다.
주의할 점
- 최단 경로가 여러개일 수 있고, 그 최단경로가 중복되어 사용 될 수 있다.
- 예시를 들어보겠다.
1
이 출발지 ,5
가 목적지 일때
1 |
|
- 위와 같은 경우, 첫번 3 > 5가 중복되는 경우를 처리해야한다.
- 단순히 첫번째 다익스트라를 통해 나온 경로를 방문 표시 해버린다면 3 > 5 가 방문 표시되어 1 > 4 에 대한 처리가 되지 않는다.
- 비교하는 과정에서 INF를 더해 발생하는
overflow
를 조심해야 한다.
첫번째 방법 코드
1 |
|
두번째 방법 코드
1 |
|
디버깅
- 주의할점 에서 언급한 내용을 놓쳤었다.
피드백
BFS
를 통해 최단경로를 다 찾는법을 배웠다.- 요새 밤에 푸는 문제가 더 잘 안 풀리는것 같다.
- 첫
WA
를 받고 문제점은 바로 찾았으나, 아이디어를 내가 싫어, 자고 일어난 뒤 다시 시도하니 금방 풀렸다..