"왜 다른 버텍스까지 추가하는가"
여러 사람들의 다익스트라 코드를 보아왔지만 INF인 정점까지 처음에 다 우선순위 큐에 넣는 경우는 오히려 거의 보지 못한 것 같습니다. 배울 때는 그렇게 배우긴 했었는데, 그건 STL의 priority_queue가 아니라 중간의 값의 변경이 가능한 형태의 힙을 사용한 거라 std::priority_queue에서는 무의미해 보입니다.
"왜 굳이 dst가 cost와 다르다는 것을 체크해야 하는가"
그렇게 하지 않으면 어떤 정점이 우선순위 큐에 여러 번 들어갔다 나올 때, 처음에 나왔을 때의 cost만 가지고 계산을 해야 하는데 그보다 이전에 들어간, 더 나쁜 cost 상태에서 또 연산을 할 수 있기 때문입니다. 질문자님의 경우 무조건 간선을 큐에 다 넣은 뒤에, 큐에서 빼냈을 때 그 끝점의 거리를 갱신해주기 때문에 INF가 아닌지만 체크하면 되지만, 후자의 코드의 경우 큐에 삽입할 것인가 여부 자체를 dst 배열을 통해 미리 판단하기 때문에 (이는 평균적으로 힙에 들어갈 원소의 수를 줄여주는 역할을 합니다) 이와 같은 체크가 반드시 필요합니다.
leaps 5년 전
저는 항상 알고리즘을 접근할 때 제 직관으로 먼저 접근을 합니다.
그래서 직관적으로 결국 시작지점에서 부터 시작하여 현재 갈 수 있는 간선만 우선순위큐에 넣고 시작하면, 최대 V-1번만 Dequeue하면 문제를 풀 수 있다고 생각하였습니다.
그래서 제가 생각한 로직은 다음과 같습니다.
이렇게 해결하였습니다.
그런데 일반적으로 코드구현을 이런식으로 하지 않더군요.
제가 본 일반적인 코드의 루틴은 다음과 같습니다.
입니다.
제가 궁금한 점은 우선 1번, 왜 src vertex와 Cost만 큐에 넣으면 될 것인데 왜 나머지 버텍스를 INF Cost와 함께 삽입하는지가 이해가 안됩니다.
그리고 2번, 이 구조는 BFS로 다익스트라를 접근한 케이스라 무조건 cost가 최소인 간선을 얻게 될 것인데, 왜 굳이 저런 조건문이 추가된건지 궁금합니다. 그냥 제 방식대로 dist[cur.obj] != INF로 해도 될 거 같은데요;
이런 질문을 드리는 이유는 보편적인 코드에는 이유가 있기 때문입니다.
다익스트라는 유명한 알고리즘이고, 저보다 앞서 더 많이 생각한 사람이 생각해서 짠 코드인데, 이유가 있을 것이라고 생각합니다.