[11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)

2023. 3. 20. 13:19·Coding Test/Graph
목차
  1. 벨만 포드
  2. 기출
  3. 과정
  4. 풀이
728x90
 

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

 

벨만 포드

  • 최단 거리를 구하는 알고리즘
  • 음수간선 OK
  • 전체 그래프에서 음수 사이클의 존재 여부를 판단할 수 있음
  • O(VE)

기출

  • 음수사이클이 있는 지 체크하는 문제 → 시간여행, 과거, 웜홀
  • 음수간선, 시작점이 있고 최단거리 구하는 문제

과정

  1. 에지 리스트로 그래프를 구현하고 최단 경로 리스트 초기화
  2. 모든 에지를 확인해 정답 리스트 업데이트
  3. 음수 사이클 유무 확인 : 모든 에지를 한 번씩 다시 사용해 업데이트 되는 노드가 발생하는지 확인
업데이트 조건과 반복

- 최단거리 리스트에서 업데이트 반복 횟수 : N-1
    (노드의 개수가 N이고, 음수 사이클이 없을때 특정 두 노드의 최단 거리를 구성할 수 있는 에지의 최대 개수)
- D[s] != ∞ && D[e]>D[s]+w 일때 D[e] = D[s]+ w로 리스트의 값을 업데이트

- 업데이트 반복 횟수가 K번 ➡️ 해당 시점에 정답 리스트의 값은 시작점에서 K개의 에지를 사용했을 때 각 노드에 대한 최단 거리

 

풀이

자꾸 출력초과가 뜨는 원인은 '1번 도시에서 다른 도시로 가는 길목에 음수 사이클이 존재하는데도 모든 도시로 가는 시간을 굳이 출력'하고 있기 때문입니다. 보통은 아래 둘 중 하나가 원인이므로 꼼꼼히 확인해주세요.

1. 시간의 합이 자료형이 감당할 수 없을 정도로 커지는 경우. Python인 경우에는 정수 간의 연산에서 별도의 제한은 없기 때문에 문제가 되지 않습니다.
2. INF 값이 충분히 크지 못한 경우. 시간이 매우 걸리는 경로로 가더라도 INF 값을 넘지 못하도록 크게 잡으셔야 합니다. (제가 여기에 걸려서 코드 수정만 계속 했습니다)
"""
벨만-포드

N개의 도시(1~500), 한 도시에서 출발해 다른 도시에 도착하는 버스 M개(1~6,000)
A 시작도시 B 도착도시(1~N)  C 걸린시간(-10,000~10,000)

1번 도시에서 출발해 나머지 도시로 가는 가장 빠른 시간

시간을 무한히 오래전으로 되돌릴 수 있으면 1번째 줄에 -1출력 (음수간선싸이클 있으면)
아니면 n-1개 줄에 걸쳐 각줄의 1번 도시에서 출발해 2번 도시, 3번 도시,...,N번 도시로 가는 가ㅏㅇ 빠른 시간 순서대로 출력
경로 없으면 -1 출력
"""

import sys
input = sys.stdin.readline

n, m = map(int, input().split())

# 에지 리스트
graph = []
for i in range(m):
    u, v, w = map(int, input().split())
    graph.append((u, v, w))

# print(graph)

# 최단 경로 리스트
d = [sys.maxsize] * (n+1)

d[1] = 0

# print(d)


cycleYn = False

for _ in range(n-1):
    for start, end, weight in graph:
        if d[start] != sys.maxsize:
            d[end] = d[start] + weight if d[end] > d[start] + weight else d[end]

for start, end, weight in graph:
    if d[start] != sys.maxsize and d[end] > d[start] + weight:
        cycleYn = True

# print(d)

if cycleYn:
    print(-1)
else:
    for i in range(2, n+1):
        if d[i] != sys.maxsize:
            print(d[i])
        else:
            print(-1)

 

더보기
 

글 읽기 - INF 크기를 충분하게 크게 잡으셔야 합니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

728x90
  1. 벨만 포드
  2. 기출
  3. 과정
  4. 풀이
'Coding Test/Graph' 카테고리의 다른 글
  • [11404번] 가장 빠른 버스 노선 구하기(그래프, 최단거리 , 플로이드)
  • 그래프 최단거리 알고리즘 정리 및 비교 (다익스트라, 벨만-포드, 플로이드-워셜)
  • [1854번] k번째 최단경로 구하기
  • [1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    정렬
    DP
    최소신장트리
    조합
    스택
    파이썬
    트리
    다익스트라
    최단거리
    월간코드챌린지
    DFS
    Algorithm
    힙
    큐
    프로그래머스
    구간합
    백준
    구현
    BFS
    LIS
    이분탐색
    자료구조
    알고리즘
    덱
    플로이드워셜
    그리디
    최대공약수
    그래프
    재귀
    동적계획법
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.