벨만-포드 알고리즘을 통해 시작 노드에서 도착 노드까지
최단 경로
가 아닌최장 경로
를 구한다.
도중 사이클이 존재한다 할지라도 도착 노드까지 가는 데 사이클이 생기지 않는다면 (즉 노드의 개수가 n
이고 n
번째 반복에서 거리 값이 업데이트될 때 업데이트되는 거리 노드로 인해 도착 노드로 가는 길에 사이클이 생기지 않는다면) 경로가 존재한다.
import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
edges = [[] for _ in range(n+1)]
INF = sys.maxsize
for _ in range(m):
u, v, w = map(int, sys.stdin.readline().rstrip().split())
edges[u].append([v, w])
def Bellman_Ford(start):
distances = [-INF for _ in range(n+1)]
# 최장 거리를 업데이트하기 위해 음의 무한대로 거리 값 초기화
distances[start] = 0
path = [0 for _ in range(n+1)]
for i in range(n):
for cur_node in range(1, n+1):
for next_node, next_cost in edges[cur_node]:
if distances[cur_node] != -INF and distances[next_node] < next_cost + distances[cur_node]:
# 업데이트 가능할 때 업데이트
distances[next_node] = next_cost + distances[cur_node]
path[next_node] = cur_node
if i == n - 1: distances[next_node] = INF
# 사이클 존재한다면 해당 노드에 대한 거리 값 양의 무한대로 표시
result = []
cur_node = n
if distances[n] == INF:
# distances는 1번 노드에서 해당 노드로 가는 최대 비용. INF라면 사이클 존재한다는 뜻.
print(-1)
return
while cur_node != 1:
result.append(cur_node)
cur_node = path[cur_node]
result.append(cur_node)
result = result[::-1]
print(*result, sep=' ')
# n번 -> 1번 거꾸로 가는 도중 사이클 없음이 distances[n] != INF를 통해 보장
return
Bellman_Ford(1)