Algorithm

Dijkstra

motosw3600 2021. 12. 28. 17:02

Dijkstra(다익스트라)

  • Dynamic Programming을 이용한 최단경로 알고리즘
  • 특정 노드에서 다른 나머지 노드로 가는 최단경로를 구할 때 사용
  • 첫노드부터 모든 노드의 최단거리 저장하는 배열 및 우선순위큐 사용

Dijkstra 알고리즘 순서

1. 노드의 개수만큼 distances 생성, 시작 노드의 값은 0

2. 우선순위 큐 생성 및 첫노드 가중치 0

3. 우선순위큐에서 추출된 노드와 연결된 인접 노드와의 거리 + 추출된 노드 가중치를 계산하여

    distances의 값보다 적으면 distances업데이트 및 우선순위큐 insert

 

구현 코드

struct NodePriority: Comparable {
    var node: String = ""
    var priority: Int = 0

    static func < (lhs: NodePriority, rhs: NodePriority) -> Bool {
        return lhs.priority > rhs.priority
    }
}

func dijkstra(start: String, graph: [String: [String: Int]]) -> [String: Int] {
    var distances: [String: Int] = [:]
    var priorityQueue = Heap(elements: [NodePriority(node: start, priority: 0)], sort: >)
    let INF = 987654321
    
    for node in graph.keys {
        if node == start { distances[node] = 0 }
        else { distances.updateValue(INF, forKey: node)}
    }
    
    while priorityQueue.elements.count > 0 {
        guard let poppedValue = priorityQueue.pop() else { break }
        
        if distances[poppedValue.node]! < poppedValue.priority {
            continue
        }
        
        for (node, priority) in graph[poppedValue.node]! {
            let distance = priority + poppedValue.priority
            if distance < distances[node]! {
                distances[node] = distance
                priorityQueue.insert(NodePriority(node: node, priority: distance))
            }
        }
    }
    
    return distances
}

let graph: [String: [String: Int]] = [
    "A" : ["B": 1, "C" : 2],
    "B" : ["D": 2, "E": 4],
    "C" : ["D": 2],
    "D" : ["E": 1],
    "E" : [:]
]

dijkstra(start: "A", graph: graph) // ["A": 0, "B": 1, "C": 2, "D": 3, "E": 4]

 

참고 출처 : https://babbab2.tistory.com/110

'Algorithm' 카테고리의 다른 글

Merge Sort  (0) 2022.02.16
Floyd Warshall  (0) 2021.12.28
Binary Search  (0) 2021.12.28
Swift Combination, Permutation  (0) 2021.12.14