최단 경로 문제란?
- 정점 $u$에서 정점 $v$까지의 경로 중에서 경로의 값이 가장 작은 경로를 찾는다
- $\delta (u, v)$
벨만포드 알고리즘
음수 간선의 값(negative-weight edges)
이렇게 생긴 경로 그래프가 있고, $s$ 에서 $g$로 가는 경로를 구하려고 한다.
총 세 가지 경로를 생각해볼 수 있는데, (1) $ab$ 를 거쳐가는 경로 (2) $cd$ 를 거쳐 가는 경로 (3) $ef$ 를 거쳐 가는 경로다.
(1) $ab$ 를 거쳐가는 경로
길이 하나 뿐이므로 경로의 값을 모두 더해서 구하면 된다 -> $3$
(2) $cd$ 를 거쳐 가는 경로
$c$ 와 $d$ 사이가 싸이클 형식으로 되어 있으므로 $cd$ 안에서 싸이클을 돌고 이동할 수 있다
단 이 경로의 경우 싸이클을 돌수록 경로값이 $+3$ 되므로 최단 거리를 구하는 우리 문제에서는 고려할 필요가 없다
(2) $ef$ 를 거쳐 가는 경로
반면에 이 마지막 경로 같은 경우는 싸이클을 돌수록 경로값이 $-3$ 된다
최단 경로를 구하려다가 이 무한대의 음수 싸이클에 빠질 수가 있기 때문에, 이런 경우를 피해야 한다
--> 음수 간선 자체가 문제가 되는 게 아니라, 시작점에도 도착점에 이르기까지 도달할 수 있는 음수 순환이 문제되는 것 ("가다가 만날 수 있는")
--> 최단 경로 = 출발점으로부터 도달가능하며 음의 값을 가지는 순환이 없는 경우
직전 정점 하위 그래프
직전 정점 하위 그래프(predecessor subgraph) 중에서 가장 올바른 값(최적해 구조 optimal substructure)을 찾는 방법은?
- 완화(relaxation) : 현재 경로값보다 더 적은 경로가 존재하면 값을 변경한다
벨만포드 알고리즘
- 하나의 시작점에서 하나의 도착점으로 가는 최단 경로 문제를 해결
- 음의 간선이 있는 경우에도 문제를 해결
- vertex를 기준으로 relax하는 다익스트라와는 다르게, 간선을 기준으로 relax한다는 특징이 있음
<pseudo code>
1. graph, weight, start 가 주어진다
2. (vertex-1)번 반복한다: graph 내 모든 edge에 대해서, relaxation 수행
3. 기존의 vertex 값과, 기존 vertex 값에 새로운 경로값을 더한 결과 중에서 무엇이 더 큰지 비교한다
(새로운 경로를 추가했을 때 기존 경로값보다 작아지는지 커지는지 비교하는 과정)
예제
$s$(start)에서 각 vertex 로 가는 경로
- 처음에는 INF $\infty $ 로 초기화
처음 $s$에서 $t$와 $y$로 가는 경로값은 각각 $6$, $7$로 설정할 수 있다
그 다음, $t$와 $y$를 기준으로 relaxation을 반복한다
(왼) $t$와 $y$에서 $x$로 갈 때 비교, (오) $t$와 $y$에서 $z$로 갈 때 비교
**지금 쓰다가 알았는데 위쪽 $z$는 $x$를 잘못 쓴 겁니다!!!!!!!!
비교한 결과 아래와 같이 업데이트할 수 있다
그 다음, $x$와 $z$를 기준으로 relaxation을 반복한다
$x$에서 $t$로 갈 수 있으며, 이때 경로값은 $4+(-2)$이기 때문에 $t$까지의 경로값을 $2$로 수정할 수 있음
$z$에서 $s$로 돌아가는 것은 의미 없으므로 패스
$z$에서 $x$로 갈 수 있으나, 경로값이 $2+9$로 더 커지므로 패스
노드 $t$가 경로에 추가되었으므로 $t$에서 relaxation 또 수행, $z$로 갈 때 경로값이 $-2$로 작아지므로 업데이트할 수 있음
수행시간
Vertex가 추가될 때마다 모든 edge를 추가하기 때문에 수행 시간은 $O(VE)$
파이썬 코드
(업데이트 예정)
'컴퓨터 > 알고리즘&자료구조' 카테고리의 다른 글
최소 신장 트리 구하기 : 크루스칼(Kruskal) 알고리즘 (0) | 2022.10.05 |
---|---|
합집합 찾기(union-find) (0) | 2022.10.05 |
자료구조 : 힙(heap) (0) | 2022.09.27 |
최단 경로 문제: 다익스트라 알고리즘 (0) | 2022.09.26 |
빅오표기법(Big-O notation)과 시간복잡도 (0) | 2022.09.25 |