ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dijkstra Algorithm(다익스트라 알고리즘)
    Data Structure 2022. 8. 26. 16:13
    728x90

    최단 경로 알고리즘 중 가장 많이 사용된다고 할 수 있는 다익스트라 알고리즘에 대해서 알아보자

     

    • 특징 : 무방향 그래프, 방향 그래프에 모두 적용 가능하다.
    • 가정 : 모든 간선은 음이 아닌 비용을 가진다.

     

    ■ 다익스트라 알고리즘의 Concept

    • 시작 정점 ~ 모든 다른 정점까지의 최단 경로를 구한다.
    • 시작 정점 v에서 정점 u까지의 최단경로 dist[u]를 구해 정점 u가 집합 S에 추가되면 정점 u에 의해 단축되는 경로가 있는지를 반복적으로 확인한다.
    • 현재 알고 있는 dist[w]와 새로 추가된 정점 u를 거쳐가는 dist[u] + cost[u][w]를 비교해 더 단축된 작은 값을 새로운 dist[w]로 가중치를 수정한다.

     

    dist

        A           B           C          D           E

    0 10 5

    pred

         A            B           C          D           E

      A A    

     

     

    이와 같은 초기 상태를 가진 경로가 있다고 가정해 보자. 이를 통해 끊임없이 dist와 pred를 수정한다.

     

    1) dist 중 가장 작은 값을 가진 C 지점을 정점 u라 지정하고 S집합에 추가한 S = {A, C} 상태에서 A와 C를 제외한 경로를 체크한다.

    min{ dist[B], dist[C] + cost[C][B] } = min {10, 5+3} = 8 → dist[B]

    min{ dist[D], dist[C] + cost[C][D] } = min {∞, 5+9} = 14 → dist[D]

    min{ dist[E], dist[C] + cost[C][E] } = min {∞, 5+2} = 7 → dist[E]

     

    dist

        A           B           C          D           E

    0 8 5 14 7

     

    pred

         A            B           C          D           E

      C A C C

     

    2) dist 중 이미 거친 A,C를 제외한 정점 중 가장 작은 값을 가진 E 지점을 정점 u라 지정하고 S집합에 추가한 S={A,C,E} 상태에서 A, C, E를 제외한 경로를 체크한다.

     

    min{ dist[B], dist[E] + cost[E][B] } = min {8, 경로X} = 8 → dist[B]

    min{ dist[D], dist[E] + cost[E][D] } = min {14, 7+6} = 13 → dist[D]

     

    dist

        A           B           C          D           E

    0 8 5 13 7

     

    pred

         A            B           C          D           E

      C A E C

     

    3) dist 중 이미 거친 A,C,E를 제외한 정점 중 가장 작은 값을 가진 B 지점을 정점 u라 지정하고 S집합에 추가한 S={A,C,E,B} 상태에서 A,C,E,B를 제외한 경로를 체크한다.

     

    min{ dist[D], dist[B] + cost[B][D] } = min {13, 8+1} = 9 → dist[D]

     

    dist

        A           B           C          D           E

    0 8 5 9 7

    pred

         A            B           C          D           E

      C A B C

     

    4) 집합 S에 마지막 경로인 D가 추가되면서 S={A,C,E,B,D}이고 dist = {0,8,5,9,7}, pred = { ,C,A,B,C}로 최단 경로가 완성된다. 

     

     

     

    위에서 설명한 경로를 코드로 옮겨 보았다.

    • 가중치가 가장 작은 정점(노드)을 선택하는 함수 : select_next 함수
    • 다익스트라 알고리즘 : shortest_path_D 함수

    ■ shortest_path_D 함수 설명

    1) 두번째 for문에서 path_mincost 변수에 cost 가중치 값이 무한대가 아니면 시작점을 넣고, 아니면 null로 처리한다.

    (path_mincost 변수는 위에서 설명한 pred이다.

    2) 세번째 for문에서 경로가 없으면 의미없는 값 -1을 담고, 경로가 있으면 s[u]에 true값 1을 담는다. u == -1이 되면 방문할 곳이 없으므로 break로 처리한다.

    3) 네번째 for문에서 다익스트라 알고리즘 수식을 계산하고 새로운 가중치 계산이 기존 가중치 계산 보다 더 작게 될 때 dist[w]에 새로운 가중치값을 담아주고 path_mincost 변수를 새로운 정점 u로 담아준다.

     

    ■ 메인함수

    메인함수에서 위에서 정의한 shortest_path_D를 cost값으로 정해주고 A~D의 최종 cost는 9라는 값을 도출해 낼 수 있다. 

     

    => 손으로 푼 값과 코드로 도출해 낸 결과값이 같음을 볼 수 있다.

     

    이렇게 Dijkstra Algorithm을 알아보았다. 최단 경로 알고리즘 중 가장 많이 쓰이고 유명한 알고리즘이므로 잘 기억해 두자.

    728x90

    'Data Structure' 카테고리의 다른 글

    Graph(BFS 너비우선탐색)  (0) 2022.08.31
    Graph(DFS 깊이 우선 탐색)  (0) 2022.08.29
    6. List#1 - LinearList  (0) 2022.03.20
    5. Recursion(재귀)  (0) 2022.03.19
    4. Queue(큐)  (0) 2022.01.28
Designed by Tistory.