본문 바로가기

알고리즘

그래프 (Graph) - 최단 경로 (Dijkstra, Ford 알고리즘)

최단 경로

가중치 graph, 출발점(source), 종점(destination), 방향 graph

 

전제 조건

방향 그래프 G = (V, E)

n개의 정점

G의 간선에 대한 가중치 함수 lengt(i, j)

출발점 v

 

 

문제점

1. 단일 출발점 / 모든 종점 (간선의 길이가 양수인 경우)

    

    ex ) 

간선 비용 (length) 최단 경로 비용 (dist)

 

Dijkstra 알고리즘 - 비용

모든 가중치가 양수일때만 적용 가능

 

단계

① S = 출발점 v를 포함하여 이미 최단 경로가 발견된 정점들의 집합

② S에 속하지 않는 정점들 중 dist 값이 최소인 정점 u 선택, 이는 S의 원소가 됨

③ S에 속하지 않는 정점들에 대해 새로운 최단 경로가 존재하는 경우, 해당 정점에 대한 dist 값 갱신

    즉, dist[w] = min { dist[w], dist[u] + length[u,w] } ( w $\notin$ S )

④ S에 n-1개의 정점이 포함될 때까지 n-2번 반복

 

dyeoma.tistory.com/31

 

Dijkstra 알고리즘

 

dyeoma.tistory.com

Dijkstra 알고리즘 - 경로

일차원 배열 path를 역추적

최단 경로 비용 (dist) 최단 경로 (path)
????????

 

 

2. 모든 쌍의 최단 경로

   서로 다른 정점의 쌍 u와 v 간의 최단 경로 길이 (음수 길이 cycle 존재하지 않을 때)

   즉, A(i, j)가 정점 i로부터 j까지의 최단 경로의 길이인 행렬 A 결정

 

방법

① 각 정점을 출발점으로 하여 Dijkstra 알고리즘 n번 적용

② 동적 프로그래밍 적용 - Ford 알고리즘

 

두 방법 모두 시간 복잡도는 O($n^3$)으로 같으나, 실제 소요시간은 ②이 더 빠르다

 

 

Ford 알고리즘

원리

i에서 j로의 최단 경로에서, k가 이 최단 경로 상 중간에 있는 점이라면

i에서 k로의 부분 경로와 k에서 j로의 부분 경로가 각각 최단 경로

 

$A^k(i, j)$ = 0~k번째 정점만 통과하는 i에서 j로 가는 최단 경로 길이

$A^{-1}$ = 인접행렬

 

순환식

$A^{-1}(i,j)$ = length(i, j)   (0≤i≤n-1)

 

 

$A^{k-1} → A^k$ 만드는 법

쌍 i, j의 최단 경로가 정점 k를 통과하지 않을 때 : $A^k(i, j) = A^{k-1} (i,j)$

쌍 i, j의 최단 경로가 정점 k를 통과할 때          : $A^k(i, j) = A^{k-1} (i,k) + A^{k-1}(k,j)$

∴ $A^k (i, j) $= min { $A^{k-1} (i,j), A^{k-1} (i,k) + A^{k-1}(k,j)$ }      (0≤k≤n-1)

 

 

ex)

 

 

dyeoma.tistory.com/32

 

Ford 알고리즘

dyeoma.tistory.com

 

'알고리즘' 카테고리의 다른 글

정렬(Sorting) - 삽입 정렬 (Insertion Sort)  (0) 2020.07.31
탐색 (Search) - 순차탐색, 이진탐색  (0) 2020.07.29
Prim 알고리즘  (0) 2020.07.28
Kruskal 알고리즘  (0) 2020.07.28
너비 우선 탐색 (Breadth First Search, BFS)  (0) 2020.07.26