1504번: 특정한 최단 경로 (acmicpc.net)


위 문제의 경우


1번 정점 --> N번 정점까지의 최단 거리를 구하되,


입력으로 주어지는 v1, v2번 정점을 반드시 지날 때의 최단 경로를 구해야 하는 문제입니다.


그래서 오랜 시간 고민하고 반례들을 살펴보면서 저는 다음과 같이 풀었습니다.

( 코드 주소:  http://boj.kr/14bc4f5fbec144afaa3073ab21aceebd ) (링크 수정했습니다. 죄송합니다 ㅠㅠ)

------------------------------------------------------------------

<아이디어>

1번 정점 --> N번 정점까지의 최단 경로를 p (path의 p)라 하자.


그럼 v1과 p 사이의 최단 거리를 생각할 수 있다. --> 이 최단 거리를 ( p 상의 모든 점들과 v1의 최단 거리 )의 최솟값으로 정의하고,

( p 상의 모든 점들과 v1의 최단 거리 )가 최소가 되도록 하는 p 상의 점을 편의상 수선의 발 p1이라 부르자.


마찬가지로 v2에 대해서도 위의 최단 거리 및 수선의 발(p2) 을 생각할 수 있고, 이때 문제의 답은 아래의 두 값중 최솟값이다.


dist(1, p1) + dist(p1, v1) + dist(v1, v2) + dist(v2, N)


dist(1, p2) + dist(p2, v2) + dist(v2, v1) + dist(v1, N) // 이때 주어진 그래프는 무방향 그래프여서 dist(v1, v2) = dist(v2, v1).


(만약 두 값 모두 무한대 값이라면 문제에서 요구한대로 -1 출력)

------------------------------------------------------------------


다행히 문제에서 기본적으로 요구한 1초 제한을 파이썬으로도 맞출 수 있었고 (920 ~ 930ms) 그래서 한 건 해냈다라는 느낌으로 넘어가려고 했는데...


질문 게시판과 맞힌 사람들을 살피다보니 뭔가 더 간단한 방법이 있다는 느낌이 들었습니다.


특히 위 아이디어를 구현하다보니 dijkstra만 5번을 해야해서 구현하면서도 뭔가 찝찝했고요.


혹시 더 간단하거나 시간 복잡도를 더 줄이는 (상수 커팅이라도 좋습니다) 방법이 있는 것일까요?


늘 긴 질문글 들고 와서 죄송합니다 ㅠㅠ