앎을 경계하기

Programming/Algorithm

Graph - Bellman-ford's algorithm

양갱맨 2019. 12. 21. 20:39

참고 사이트 : https://ratsgo.github.io/data%20structure&algorithm/2017/11/27/bellmanford/

bellman-Ford's algorithm

keywords : 최단 경로, 음수 사이클, 그래프

개념

벨만-포드 알고리즘은 Shortest path를 구할 때 graph 내 모든 edge에 대해 edge relaxation을 수행한다.

모든 노드 개수 : |V|-1개

모든 edge에 대해 edge-relaxation을 |V|-1회 수행한다.

방법)

  • 시작 노드 A를 제외한 모든 노드의 value를 inf로 초기화한다.

  • 노드 B에서 노드 C로 가는 경우, edge cost가 2인 경우,
    B노드 값 + 간선(B,C) = inf이기 때문에 업데이트할 필요가 없다.

  • 노드 A에서 노드 B로 가는 경우, edge cost가 8인 경우,

    A노드 값 + 간선(A,B) = 0+8 이 B노드의 값인 무한대보다 작기 때문에 B노드의 값을 8로 업데이트한다.

    위와 같은 방법으로 모든 노드에 대해 edge relaxation을 적용한다.

  • cost 계산을 했을 때 이전값보다 작을 때만 업데이트한다.

음수의 경우

다익스트라와 다르게 벨만-포드는 가중치가 음수여도 적용이 가능하다.

그러나 음수 가중치가 사이클을 이루고 있으면 계속 값이 작아지므로 -inf가 되어 최단 경로를 얻을 수 없다.

따라서 모든 엣지에 대해 edge relaxation을 시작노드를 제외한 전체 노드 수 만큼 반복한 뒤, 모든 엣지에 대해 edge relaxation을 1번 수행한다. 이때 1번이라도 업데이트가 일어난다면 negative cycle이 있다는 것이다. 이는 결과를 구할 수 없다는 의미이기 때문에 false를 반환하고 함수를 종료한다.

계산복잡성

모든 노드 수 - 1(시작노드) + 마지막 모든 엣지에 대한 edge relaxation

= O(|V||E|)

주로 Dense graph는 엣지 수가 노드 수 제곱에 근사하기 때문에 간단히 O(|V|^3)이 된다.

다익스트라 알고리즘은 O(|V|^2)보다 더 크다.

이것은 음수 가중치까지 분석할 수 있어서 일종의 trade-off라고 볼 수 있다.

'Programming > Algorithm' 카테고리의 다른 글

백준 #5567 - 결혼식 Python  (0) 2019.11.30
백준 #1629 - 곱셈  (0) 2019.11.26
백준 #10830 - 행렬 제곱  (0) 2019.11.26
백준 #2740 - 행렬 곱셈  (0) 2019.11.25
백준 #1074 - Z  (0) 2019.11.25