문제 링크
https://www.acmicpc.net/problem/11657
11657번: 타임머신
첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다.
www.acmicpc.net
풀이
- 벨만 포드 알고리즘
: 음수 가중치가 있는 그래프에서 특정 시작점에서 다른 나머지 정점까지의 최단 거리를 구할 수 있는 알고리즘
: 음수 사이클의 존재 여부를 알 수 있고, 음수 사이클이 있는 경우에는 최단 거리를 찾지 못함
: 시간 복잡도 O(VE)
import sys
input = sys.stdin.readline
def bf(start):
# 자기 자신까지의 거리 0 으로 초기화
dist[start] = 0
# 정점 수 만큼 반복
for i in range(n):
# 매 반복마다 모든 간선 확인
for j in range(m):
# 현재 노드
node = edges[j][0]
# 다음 노드
next_node = edges[j][1]
# 가중치
cost = edges[j][2]
# 현재 노드까지 도달할 수 있고
# 현재 노드를 거쳐 다른 노드로 이동하는 거리가 더 짧을 경우
if dist[node] != INF and dist[next_node] > dist[node] + cost:
# 갱신
dist[next_node] = dist[node] + cost
# n-1 번 이후 반복에도 값이 갱신된다면 음수 순환 존재
if i == n-1:
return True
return False
n, m = map(int,input().split())
INF = int(1e9)
# 간선에 대한 모든 정보
edges = []
# 최단 거리 저장
dist = [INF] * (n+1)
# 간선에 대한 정보 저장
for _ in range(m):
u, v, w = map(int,input().split())
edges.append((u,v,w))
negative_cycle = bf(1)
# 음수 순환 존재
if negative_cycle :
print(-1)
else :
for i in range(2,n+1):
# 도달할 수 없는 경우
if dist[i] == INF:
print(-1)
else:
print(dist[i])
- 새로운 최단 거리 구할 수 있는 알고리즘을 배웠다
'개발 > algorithm' 카테고리의 다른 글
[백준 1865번] 웜홀 - python (0) | 2022.03.17 |
---|---|
[백준 1913번] 달팽이 - python (0) | 2022.03.17 |
[백준 1238번] 파티 - python (0) | 2022.03.11 |
[백준 1167번] 트리의 지름 - python (0) | 2022.03.11 |
[백준 14938번] 서강 그라운드 - python (0) | 2022.03.11 |