일단 dijkstra는 크게 2가지로 나눌 수 있습니다.
1. 새로 알게된 길 중에서 최솟값을 찾기.
이게 26번째에서 31번째로 추정이 됩니다.
2. 기존 거리보다, 새로 알려진 길이 더 작다면, 최단 거리 업데이트
32번째 줄인 v가, 새로 추가된 정점입니다.
문제는, 26번째 줄에서, 31번째 줄에서 for문이 다 돌고도
v가 업데이트가 되지 않은 경우인데요. 데이터를 바꿔볼게요.
5
3
1 2 2
1 3 5
2 3 1
1 3
이런 데이터가 있습니다. 다익스트라 알고리즘을 아신다는 가정하에 중간과정 생략하고 답변을 작성하겠습니다.
v=2일 때,
[0, 1, 2, 3, inf, inf] 이래 업뎃 되는군요.
다음에, 3을 방문했을 때에는, 1과 2는 방문한 정점이고 4, 5는 inf군요~
그냥 업데이트를 안 합니다. 여기서 끝내면 좋으련만.
for문 코드에 의해서 몇 번 더 돌겠지요.
이 경우, v=0이기 때문에, 이미 있지도 않은 점을 방문했다~ 이렇게 되는 겁니다.
심지어, dist[0] = 0이라고 하지 않으셨나요?
그리고 g[0][x] = 0이네요? (x = 도시들 집합에 속해있는 정점)
이 과정에서, dist[2] > dist[0] + g[0][2]이기 때문에
dist[2]가 0으로 업데이트 되는 것이고요.
cocobo123 7년 전
안녕하세요.
다익스트라에서 '다음 정점으로 가려고 현재 저장된 거리 중 짧은 값이 저장된 정점을 선택할 때' 에 관한 질문입니다.
코드에 24-26번줄에 대한 질문인데요
v를 초기화하지 않거나 v를 시작점으로 초기화하면 답이 나오는데
v를 0 으로 하면 계속 틀리더라구요. v를 초기화하지 않으면 에러가 날 거라고 생각했는데 잘 돌아가더라구요.
이유가 궁금합니다.