방문 여부를 고려하지 않으시면 정답 처리가 됩니다.
1753번 - 최단경로
https://www.acmicpc.net/source/15102679
위의 코드에서 방문 여부를 확인하지 않은 코드입니다.
다익스트라 알고리즘에서 방문을 검사하는 것은 큰 의미가 없습니다. 어차피 그 다음에 최솟값 비교에서 통과를 안 할테니까요. 전, 통상적으로 BFS 하듯이 넣긴 하지만...
방문 여부 확인하지 않더라도, 음의 가중치가 없는 이상 절대 방문검사나 검사하지 않거나 관계없습니다.
방문한 노드 순서를 \(n_0, n_1, n_2, ..\) 이라고 할 때, 노드값을 \(N(n_0), N(n_1), ...\) 이라고 한다면,
뒤에 방문한 노드값이 이전 방문 노드값보다 작아지는 \(N(n_b) < N(n_a)\) 인 (b > a) 경우가 있다고 하자. 그렇지 않다면, 이미 방문한 노드의 노드값이 더 작아질 수 없습니다.
nb 업데이트를 하게 만든 노드는 이전에 방문한 노드들중 하나다. na 은 절대 nb 를 업데이트한 노드가 아니다.
na 이전 방문한 노드들 중 하나였다면, na가 선택될 때, nb가 선택되었어야 맞다.
na 이후의 노드에 의해서 바뀐것이라면, na 이후의 노드값은 na의 노드값보다 크기 때문에 nb 값을 na 값보다 작게 만들 수 없다.
수학 논리에 약해서..
아, 그렇네요.
방문 여부의 갱신이 이뤄지는 위치를 잘못 봤네요, 죄송합니다.
https://www.acmicpc.net/source/15104899
(위의 코드에서 priority_queue를 사용한 정답 코드)
확인해보니, 힙이 문제였습니다.
@noxnia 다익스트라에서 방문 체크는 매우 중요합니다. 정답은 잘 나오지만, 시간이 문제입니다. http://www.secmem.org/blog/201...
댓글을 작성하려면 로그인해야 합니다.
noxnia 4년 전
일단, 다익스트라 알고리즘을 그대로 이용하기는 했고요.
프리어리티 큐는 힙을 이용해서 구현했습니다.
그 외에 중복 처리를 위해서 unordered_map을 이용했고, 이걸로 인접리스트도 동시에 처리했습니다.
질문 게시판에 있는 데이터 갯수 최대로 잡은 것도 비교를 했는데, 결과가 같았는데요.
무언가 잘못한 것 같은데, 도저히 모르겠네요.