https://deepdata.tistory.com/797
지금의 개념을 얻기 전에는 항상 distTable에 대한 생각?
: 하나의 시작점에서 모든 정점으로 가는 최단 거리가 저장되어 있다고 생각함.
여기서 더 나아가자.
하나의 시작점이 아닌 여러개의 시작점인 경우에도 동일하게 생각해야 한다.
-> 단 이때의 문제의 조건은 아마도 이럴것이다.
여러개의 spot이 있고, 모든 정점에서 여러개의 spot으로 가는 최단거리를 선택하라.
그리고 문제를 읽어보면, 여러개의 spot을 동일한 입장에서 바라보는
의도가 있다.
: 불특정한 내용
여러개의 spot을 시작점으로 본다는 내용에 대해서
기존의 다익스트라는 예를 들면
1번 ~ 5번 정점이 있고, 시작점이 2번이라고 한다면
2번을 기준으로 해서 1 ~ 5번 정점까지의 최단거리를 구하는 방식이다.
-> 그렇다는 것은 문제에서 a -> b 정점으로 가는 cost가 정해지므로
[a].push_back({b, cost}) 를 하면 된다.
다시 돌아와서 여러개의 spot가는 경로 중 최단거리를 구하는 것은
1 ~ 5번 이 spot 3개(가정)로 향하는 간선을 탐색하는 것이다.
그렇다는 것은 n개의 정점이 m개의 spot에 대해서 다익스트라를 한다는 것인데
다익스트라 시간복잡도는 E Log(n) 이다.
모든 spot에 대해서 돌려야만 최단 거리를 구할 수 있기 때문에
E Log(n) * m 이 되어 버린다.
뒤집자.
- spot 을 시작점으로 하고 모든 정점에 대해서 최단거리를 구하는 것과 동일한 방법이다.
// 조건으로는 반드시 모든 spot 중 최단거리인 정점을 구하는 것이므로, spot 을 별개의 시작점으로 봐야한다는 것이다.
-> 그렇다는 것은 굳이 위의 방법처럼 spot 하나를 찾기 위해서
다익스트라 1회 * spot m번 만큼 할 필요 없다.
- 코드
1) vertex 삽입 시 뒤집어야 한다. 시작점을 spot으로 하기로 했으니,[b].push_back({a , cost}) 로 가야 한다.
-> 왜냐하면 기존에 vertex 주어질때 a 정점에서 b정점까지로
가는 간선인데, 우리는 반대로 면접장에서 도시로 가는 것으로 변경했기 때문이다.
2) pq 에 시작점이 여러개인 spot을 전부 넣어놓고, 다익스트라 진행하자.