1에 붙어 있는 2, 3, 4 확인했을 때 최단거리는 각각 3, 6, 7이므로 이 셋 기록.
가장 짧은 2로 감.
나중에 컴퓨터는 1->2->3(비용 4)이 1->3(비용 6)보다 저렴하다는 걸 알게 됨. 더 저렴한 비용으로 갱신함. 이 과정 전까지는 1->3으로 가는 최소 비용이 6인줄 알았는데 더 짧은 거리 발견했으니 4로 갱신.
아래 표는 위 그래프를 이차원 배열로 나타낸 것이다. 특정 행에서 열로 가는 비용이다.
1행 3열의 값이 5 => 1번 노드에서 3번 노드로 가는 비용이 5라는 것.
4번노드는 2, 3, 5번 노드와 연결된다. 이제 3번 노드로 갈 수 있는 방법이 하나 생겼다. 1->3, 1->4->3. 근데 1->4->3 비용은 4로, 1->3의 비용(5)보다 적다. 따라서 3번 노드로 가는 비용을 4로 갱신해준다.
또, 이제는 5로 갈 수 있는 길이 생겼으므로 5로 가는 비용도 2로 갱신해준다.
이제 아직 방문하지 않은 노드 중 가장 비용이 적은 노드인 2번 노드로 간다. 경유해서 2번 노드로 가더라도(1, 4, 3번 노드) 비용(2, 3, 7)이 갱신되는 경우는 없다.
const graph = {
A: { B: 5, D: 9, E: 2 },
B: { A: 5, C: 2 },
C: { B: 2, D: 3 },
D: { A: 9, C: 3, F: 2 },
E: { A: 2, F: 3 },
F: { D: 2, E: 3 },
};
function dijkstra(graph, start) {
const distances = {};
const visited = new Set();
const priorityQueue = new MinPriorityQueue();
// 그래프 초기화 : 각 정점의 거리를 무한대로 설정하고 시작 정점의 거리는 0으로 설정합니다.
for (const vertex in graph) {
distances[vertex] = Infinity;
}
distances[start] = 0;
// 우선순위 큐 사용: 최소 우선순위 큐를 사용하여 현재 최단 거리의 정점을 선택합니다.
priorityQueue.enqueue(start, 0);
while (!priorityQueue.isEmpty()) {
const { element: currentVertex } = priorityQueue.dequeue();
visited.add(currentVertex);
// 인접 정점 탐색: 현재 정점의 인접 정점을 탐색하며 거리를 갱신합니다.
for (const neighbor in graph[currentVertex]) {
if (!visited.has(neighbor)) {
const newDist = distances[currentVertex] + graph[currentVertex][neighbor];
if (newDist < distances[neighbor]) {
distances[neighbor] = newDist;
priorityQueue.enqueue(neighbor, newDist);
}
}
}
}
// 결과 반환: 모든 정점에 대한 최단 거리를 반환합니다.
return distances;
}
// MinPriorityQueue 클래스 구현
class MinPriorityQueue {
constructor() {
this.queue = [];
}
enqueue(element, priority) {
this.queue.push({ element, priority });
this.queue.sort((a, b) => a.priority - b.priority);
}
dequeue() {
return this.queue.shift();
}
isEmpty() {
return this.queue.length === 0;
}
}
// 테스트
const startVertex = 'A';
const distances = dijkstra(graph, startVertex);
console.log(distances);
공통문제 : https://www.acmicpc.net/problem/1446
문제과제추천 : https://www.acmicpc.net/problem/18352
참고 : https://han-joon-hyeok.github.io/posts/dijkstra-algorithm/
https://m.blog.naver.com/ndb796/221234424646