728x90
- 음수 간선이 포함된 상황에서의 최단 거리 문제
- 시간 복잡도 O(VE)
- 다익스트라 알고리즘에 비해 느림
- 동작 원리
- 출발 노드를 설정합니다.
- 최단 거리 테이블을 초기화합니다.
- 다음의 과정을 N-1번 반복합니다.
- 전체 간선 E개를 하나씩 확인합니다.
- 각 간선을 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신합니다.
- 만약 음수 간선 순환이 발생하는지 체크하고 싶담면 3번의 과정을 한 번 더 수행합니다.
- 이때 최단 거리 테이블이 갱신된다면 음수 간선 순환이 존재하는 것입니다.
- 다익스트라 vs 벨만 포드
- 다익스트라
- 매번 방문하지 않는 노드 중에서 최단 거리가 가장 짧은 노드를 선택합니다.
- 음수 간선이 없다면 최적의 해를 찾을 수 있습니다.
- 벨만 포드
- 매번 모든 간선을 전부 확인합니다.
- 따라서 다익스트라 알고리즘에서의 최적의 해를 항상 포함합니다.
- 다익스트라 알고리즘에 비해서 시간이 오래 걸리지만 음수 간선 순환을 탐지할 수 있습니다.
- 매번 모든 간선을 전부 확인합니다.
- 다익스트라
- 기본 코드
import sys
input = sys.stdin.readline
INF = int(1e9)
# 노드의 개수, 간선의 개수
n, m = map(int,input().split())
# 간선에 대한 정보를 담는 리스트
edges = []
# 최단 거리 테이블을 모두 무한으로 초기화
dist = [INF] * (n+1)
# 간선에 대한 정보
for _ in range(m):
start, end, money = map(int,input().split())
edges.append((start,end,money))
# 벨만 포드 알고리즘
def bf(start):
# 시작 노드에 대해서 초기화
dist[start] = 0
# 전체 n번의 라운드를 반복
for i in range(n):
# 매번 "모든 간선"을 확인하며
for j in range(m):
cur = edges[j][0]
next_node = edges[j][1]
cost = edges[j][2]
# 현재 간선을 거쳐서 다른 노드로 이동하느 거리가 더 짧은 경우
if dist[cur] != INF and dist[next_node] > dist[cur] + cost:
dist[next_node] = dist[cur] + cost
# n번째 라운드에서도 값이 갱신된다면 음수 순환이 존재
if i == n-1:
return True
return False
negative_cycle = bf(1) # 1번 노드가 시작 노드
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[프로그래머스] [3차] n진수 게임 - Python (1) | 2023.02.28 |
---|---|
위상 정렬(Topology Sort) 알고리즘 (1) | 2022.12.10 |
[백준] 12851. 숨바꼭질 2 - Python (0) | 2022.10.14 |
[백준] 9935. 문자열 폭발 - Python (0) | 2022.09.23 |
str.split()와 str.split(' ')의 차이 (0) | 2022.09.22 |
댓글