새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 11657 타임머신

by 언호 2022. 1. 5.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

노드간 거리를 나타내는 간선의 가중치가 음수가 있는 경우도 있기 때문에, 다익스트라로는 어려울거라 생각했습니다.

간선 가중치에 음수가 들어간 경우 사용하는 벨만-포드 알고리즘을 학습하여 접근했습니다.

2) 알고리즘

  • 벨만-포드
    어떠한 노드에서 다른 노드로 이동하는 거리를 구할때 사용 (가중치가 음수가 있는 경우에도 사용 가능)

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')


def solution(start: int):                                               # 벨만포드 (시작 노드)
    dist[start] = 0                                                     # 시작 위치의 거리는 0으로 세팅
    
    for i in range(1, N+1):                                             # 도시의 개수만큼 반복하여 확인
        for j in range(1, N+1):                                         # 모든 도시들의 버스 경로 확인 (모든 간선 확인)
            for e in linked[j]:
                if dist[j] != 1e10 and dist[e[1]] > dist[j] + e[0]:     # 시작 지점이 무한대가 아니고, 새로운 거리가 더 짧을때
                    dist[e[1]] = dist[j] + e[0]                         # 새로운 거리 갱신

                    if i == N:                                          # N번 확인했을때도 계속 값 갱신이 일어난다면 무한 반복
                        return True
    return False


N, M = map(int, sys.stdin.readline().split())           # 도시 개수, 버스 경로 개수
linked = [[] for _ in range(N+1)]                       # 버스 경로들 저장할 리스트
dist = [0] + [1e10] * N                                 # 어떠한 도시에서 특정 도시들로 향하는 거리

for _ in range(M):
    A, B, C = map(int, sys.stdin.readline().split())    # 버스 경로들 출발지점, 도착지점, 거리
    linked[A].append((C, B))
    

if solution(1):             # 계속 무한히 반복이면 -1 출력
    print(-1)
else:
    for d in dist[2:]:
        if d == 1e10:       # 갈수없는 도시라면 -1 출력
            print(-1)
        else:
            print(d)

📝 결과 및 학습한 내용

1) 어려웠던 내용

처음에 다익스트라를 사용하여 풀이를 하려 했으나, 무한 순환이 발생하는 경우 해결하기 어려웠습니다.

(1) 참고 사이트

  • 블로그
    벨만-포드 개념 및 코드 작성 방법 학습했습니다.

2) 새롭게 학습한 내용

음수 가중치가 있는 경우에, 최소 경로를 구하는 벨만-포드 알고리즘을 학습했습니다.


🔗 문제 링크

- 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

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 17141 연구소2  (0) 2022.01.07
[백준] 1865 웜홀  (0) 2022.01.06
[백준] 1504 특정한 최단 경로  (0) 2022.01.04
[백준] 1043 거짓말  (0) 2022.01.03
[백준] 9663 N-Queen  (0) 2022.01.02

댓글