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

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

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

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

[백준] 1956 운동

by 언호 2022. 6. 8.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 접근 및 이해

특정 마을에서 운동을 출발하여, 다시 출발 마을로 돌아오는 길이 짧은 경우를 구해야 했습니다.

하나의 마을에서 출발하는 경우, 다익스트라를 이용하면 편리하지만 모든 마을에서 사이클이 존재하는지 확인이 필요하므로 플로이드 워셜 알고리즘을 이용하였습니다.

 

플로이드 워셜 알고리즘을 이용하여 모든 마을에서 최소 사이클을 한번에 구하도록 하였습니다.

2) 알고리즘

  • 플로이드 워셜

3) 풀이 코드

사용 언어 - Python

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

V, E = map(int, sys.stdin.readline().split())                                       # 마을, 도로 개수
distance = [[1e10] * V for _ in range(V)]                                           # 마을에서 다른 마을로 가는 최소 거리
answer = 1e10                                                                       # 최소 길이 사이클의 값

for _ in range(E):
    a, b, c = map(int, sys.stdin.readline().split())
    distance[a-1][b-1] = c                                                          # a 마을 ->  b 마을 거리

for k in range(V):
    for i in range(V):
        for j in range(V):
            distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j])   # i -> j 이동시, 서로 연결된 도로가 더 짧은지
                                                                                    # 다른 마을을 거쳐서 이동하는게 더 짧은지 비교 후 더 짧은 도로 선택

for i in range(V):                          
    answer = min(answer, distance[i][i])            # 출발지에서 다시 돌아오는 경우의 최소 도로 길이를 저장

print(answer if answer != 1e10 else -1)             # 사이클이 존재하지 않으면 -1 출력

🔗 문제 링크

- https://www.acmicpc.net/problem/1956

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

 

 

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

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

[백준] 1613 역사  (0) 2022.06.10
[백준] 10159 저울  (0) 2022.06.09
[백준] 2458 키 순서  (0) 2022.06.07
[백준] 11404 플로이드  (0) 2022.06.05
[백준] 2589 보물섬  (0) 2022.06.03

댓글