[자료구조] 다익스트라 알고리즘

2025. 6. 9. 15:22·자료구조

최단 경로를 구하는 방법은 다양하다. 

그 중 다익스트라 알고리즘에 대해 알아보자

다익스트라 알고리즘이란?

각 경로의 가중치를 비교해서 최단거리 경로를 찾아내는 알고리즘이다.

가중치가 양수인 그래프에서 활용이 가능하며, 음수인 경우는 벨만-포드 알고리즘을 사용하면 된다

 

어떻게 작동할까?

다익스트라 알고리즘의 작동 과정은 다음과 같다.

1. 출발 노드를 설정한다.

2. 최단 거리 테이블을 초기화 한다. 이때 초기화 값은 inf 또는 아주 큰 수로 잡는다.

3. 현재 위치한 노드의 인접 노드 중 방문하지 않은 노드를 구별하고, 방문하지 않은 노드 중 거리가 가장 짧은 노드를 찾고 해당 노드를 방문 처리한다.

4. 해당 노드를 거쳐 다른 노드로 넘어가는 가중치를 계산해 최단 거리 테이블을 업데이트 한다.

5. 3~4 과정을 최단 거리를 구할 때까지 반복한다.

 

예시를 보면서 확인하자

위와 같은 그래프가 있다고 치고 V0부터 각 노드들까지의 거리를 구해보자.

V0 V1 V2 V3 V4 V5
inf inf inf inf inf inf

처음 최단거리 테이블은 이렇게 생겼다.

V0와 연결된 정점의 거리들을 갱신해보자.

V0 V1 V2 V3 V4 V5
0 2 inf inf inf 9

이제 V0와 연결된 정점인 V5까지의 거리를 갱신하면

아래와 같이 나타낼 수 있다.

V0 V1 V2 V3 V4 V5
0 2 inf inf inf min(9,2+6) = 8

그럼 자동으로 V4의 값도 11로 확정이 되기에 V2를 갱신해보자.

V0 V1 V2 V3 V4 V5
0 2 10 inf 11 8

V4 -> V2 경로도 있기 때문에 한번 더 갱신을 해보면

V0 V1 V2 V3 V4 V5
0 2 min(10,11+7) = 10 inf 11 8

이렇게 갱신이 되고 마지막으로 V3를 구해보면

먼저 V2->V3로 놓고 수행해보자. 

V0 V1 V2 V3 V4 V5
0 2 10 11 11 8

다른 경로들과 비교해봤을 때 11보다 작은 경로가 없기 때문에 위와 같이 테이블이 확정이 된다.

 

다익스트라 알고리즘 의사코드

predecessor Dijkstra(G, start)
    // 1. 초기화
    for each 정점 v in G.V do
        distance[v] ← ∞
        predecessor[v] ← null
    distance[start] ← 0

    allowedVertices ← ∅       // 처리(허용)된 정점 집합

    // 2. 메인 루프: 모든 정점이 처리될 때까지
    while allowedVertices ≠ G.V do
        // 2.1. 아직 처리되지 않은 정점 중 거리 최솟값을 갖는 w 선택
        w ← argmin { distance[v] | v ∈ G.V \ allowedVertices }

        // 2.2. w를 처리 집합에 추가
        allowedVertices ← allowedVertices ∪ {w}

        // 2.3. w와 인접한 정점들의 거리 갱신
        for each v ∈ Adj[w] do
            if v ∉ allowedVertices then
                alt ← distance[w] + weight(w, v)
                if alt < distance[v] then
                    distance[v] ← alt
                    predecessor[v] ← w

    // 3. 결과 반환
    return distance, predecessor
728x90
반응형

'자료구조' 카테고리의 다른 글

[자료구조] 그래프와 순회(BFS, DFS)  (1) 2025.06.09
[자료구조] Hash  (0) 2025.06.08
[자료구조] 탐색 알고리즘 (선형탐색 & 이분탐색)  (0) 2025.06.08
[자료구조] Merge Sort, Heap Sort, Quick Sort  (1) 2025.06.06
[자료구조] Selection Sort(선택정렬), Insersion Sort(삽입정렬)  (0) 2025.06.05
'자료구조' 카테고리의 다른 글
  • [자료구조] 그래프와 순회(BFS, DFS)
  • [자료구조] Hash
  • [자료구조] 탐색 알고리즘 (선형탐색 & 이분탐색)
  • [자료구조] Merge Sort, Heap Sort, Quick Sort
CromArchive
CromArchive
배우고 정리하고 발전하는 블로그입니다
    반응형
  • CromArchive
    CromArchive
    CromArchive
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 자료구조
      • BIOS 프로젝트 (플러터)
      • C언어
      • C++
      • Python
      • 고등학교 활동
      • SSU::DoCode 프로젝트 1
      • IT 프로젝트 공모전(백엔드)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ssu_cse
    최단경로
    C++
    게임만들기
    분할정복
    백준
    빠른거듭제곱
    c언어
    다익스트라 알고리즘
    정수론
    selections sort
    ssucse
    songcheon_highschool
    재귀
    SSU
    브루트포스 알고리즘
    ssu::docode
    자료구조
    주술회전
    로그라이크
  • 최근 댓글

  • 최근 글

  • 300x250
  • hELLO· Designed By정상우.v4.10.3
CromArchive
[자료구조] 다익스트라 알고리즘
상단으로

티스토리툴바