알고리즘/백준

[백준] 11657번 파이썬 _ 타임머신

이숭간 2021. 8. 11. 23:43
728x90

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

문제유형 : 벨만포드 

 

 

문제풀이 :

  • 음수간선이 존재하는 최단경로를 구하는 문제
  • 벨만포드 알고리즘 그대로 구현하는 문제
    • 벨만포드 알고리즘 설명 - https://esoongan.tistory.com/185?category=915633

 

정답코드 :

# 노드개수, 간선개수
n,m = map(int, input().split())
# 간선정보를 담을 리스트
edges = []
# 최단거리 테이블 초기화
INF = int(1e9)
dist = [INF] * (n+1)

# 간선정보 입력받기
for _ in range(m):
    a,b,c = map(int, input().split())
    edges.append((a,b,c))

def bf(start):
    # 시작노드에 대해 초기화
    dist[start] = 0

    # 전체 n번의 라운드를 반복 (전체노드를 방문)
    for i in range(n):
        # 방문할때마다 모든간선을 확인
        for j in range(m):
            curr = edges[j][0] # 현재노드
            next_node = edges[j][1] # 목적지노드
            cost = edges[j][2]
            # 현재 간선을 거쳐서 다른 노드로 이동하는 거리가 더짧은 경우
            if dist[curr] != INF and dist[next_node] > dist[curr] + cost:
                dist[next_node] = dist[curr] + cost
                if i==n-1: #n번째 라운드에서 값이 갱신되었다면 음수순환이 존재한다는것
                    return True

    return False


negative_cycle = bf(1)

if negative_cycle:
    #print("음수순환이 존재한다.")
    print(-1)
else:
    # 1번노드를 제외한 다른 모든 노드로 가는 최단거리
    for i in range(2, n+1):
        if dist[i] == INF:
            print('-1') #출발노드에서 그 지점까지 가는방법 없음
        else:
            print(dist[i])