[백준] 11657번 타임머신 | 벨만 포드 알고리즘 파이썬 Python

2025. 2. 20. 16:02·코딩테스트 준비/문제풀이

백준 11657번 타임머신 문제는 최단거리 알고리즘 중에서 벨만 포드를 써야 한다.

문제에 버스 시간 C가 양수가 아닌 경우가 있기 때문에 다익스트라 알고리즘은 사용할 수 없다.

 

다익스트라는 가중치가 양수일 때만, 음수가 있는 경우는 벨만 포드를 쓴다.

 

https://www.acmicpc.net/problem/11657

 

문제

 

 

 

설명

 

최단 거리 알고리즘(다익스트라, 벨만포드, 플로이드)의 총정리는 알고리즘 카테고리에서 다뤘으니

여기선 문제에 대한 분석만 하겠다.

 

1. 최단 거리 리스트는 출발 노드만 0, 나머지는 무한대로 초기화한다.

dist = [float('inf')] * (n+1)
dist[1] = 0

 

 

2. 벨만 포드는 엣지가 중심이므로 엣지에 대한 그래프를 만든다.

graph.append([start,end,time])

 

 

3. 노드가 n개인 경우 엣지의 최대 갯수는 n-1개이다.

출발 노드가 무한대가 아니고 D[end] 가 D[start] + time 보다 작을 때 리스트 값을 업데이트한다.

for _ in range(n-1):
    for start, end, time in graph:
        if dist[start] != float('inf') and dist[end] > dist[start] + time:
            dist[end] = dist[start] + time

 

 

4. n-1번 업데이트한 결과와 n번째 결과값을 비교해서 업데이트가 일어나면 음수사이클이 존재한다는 뜻이다.

즉 최단거리를 구할 수 없으므로 -1을 출력한다.

for start, end, time in graph:
    if dist[end] > dist[start] + time:
        print(-1)

 

 

코드
import sys
input = sys.stdin.readline

n, m = map(int, input().split())
graph = []
dist = [float('inf')] * (n+1)
dist[1] = 0

# 엣지 데이터 저장
for _ in range(m):
    s, e, t = map(int, input().split())
    graph.append([s,e,t])

# n-1번 탐색
for _ in range(n-1):
    for start, end, time in graph:
        if dist[start] != float('inf') and dist[end] > dist[start] + time:
            dist[end] = dist[start] + time

# 음수사이클 확인
for s, e, t in graph:
    if dist[e] > dist[s] + t:
        print(-1)
        sys.exit()

for i in range(2, n+1):
    if dist[i] != float('inf'):
        print(dist[i])
    else:
        print('-1')
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 준비 > 문제풀이' 카테고리의 다른 글

[프로그래머스/Python] PCCP 기출문제 1번 동영상 재생기 - 파이썬  (0) 2025.02.22
[백준] 11404번 플로이드 워셜 알고리즘 설명 - 파이썬 with python  (0) 2025.02.20
[백준] 1934번 최소공배수 - 유클리드 호제법 풀이 파이썬 Python  (0) 2025.02.14
[백준] 1850번 최대공약수 파이썬 Python / 유클리드 호제법 풀이  (0) 2025.02.14
[백준] 1012번 유기농 배추 | 파이썬 Python 너비 우선 탐색(BFS)으로 구현  (0) 2025.02.11
'코딩테스트 준비/문제풀이' 카테고리의 다른 글
  • [프로그래머스/Python] PCCP 기출문제 1번 동영상 재생기 - 파이썬
  • [백준] 11404번 플로이드 워셜 알고리즘 설명 - 파이썬 with python
  • [백준] 1934번 최소공배수 - 유클리드 호제법 풀이 파이썬 Python
  • [백준] 1850번 최대공약수 파이썬 Python / 유클리드 호제법 풀이
하이야니
하이야니
또 취준..!
  • 하이야니
    하이야니's 스케치
    하이야니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩테스트 준비
        • 알고리즘 개념
        • 문제풀이
      • 파이썬
      • 자바
      • 리눅스
      • C언어
      • 여행
        • 국내
        • 해외
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다익스트라
    프로그래머스거리두기확인하기파이썬
    거리두기확인하기풀이
    벨만포드음수사이클
    백준bfs
    프로그래머스거리두기확인하기
    프로그래머스pccp
    프로그래머스코딩테스트
    프로그래머스거리두기
    백준유클리드호제법
    프로그래머스pccp기출문제
    프로그래머스파이썬
    벨만포드다익스트라
    유클리드호제법파이썬
    유클리드호제법최대공약수
    벨만포드
    거리두기확인하기파이썬
    pccp기출문제1번
    너비우선탐색파이썬
    pccp기출문제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하이야니
[백준] 11657번 타임머신 | 벨만 포드 알고리즘 파이썬 Python
상단으로

티스토리툴바