본문 바로가기

개발/algorithm

[백준 11657번] 타임머신 - python

문제 링크

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])

- 새로운 최단 거리 구할 수 있는 알고리즘을 배웠다