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
문제 접근
앞서 배운 플로이드-워셜 알고리즘을 이용해 모든 노드 간의 최단 경로를 이차원 배열에 저장한다.
그중 자기 자신으로 돌아오는 값 중 가장 작은 값이 최소 비용의 사이클이라고 할 수 있다.
코드
import sys
input = sys.stdin.readline
INF = sys.maxsize
V,E = map(int, input().split())
graph = [[INF] * (V+1) for _ in range(V+1)]
for _ in range(E):
s, e, w = map(int, input().split())
if graph[s][e] > w:
graph[s][e] = w
# 플로이드-워셜 알고리즘 수행 코드
for cross in range(1, V+1): # 거쳐가는(cross) 노드를 기준으로
for s in range(1, V+1):
for e in range(1, V+1):
if graph[s][e] > graph[s][cross] + graph[cross][e]:
graph[s][e] = graph[s][cross] + graph[cross][e]
answer = INF
for i in range(1, V+1):
answer = min(answer, graph[i][i])
# print(graph)
if answer == INF:
print(-1)
else:
print(answer)
문제 회고
플로이드-워셜 알고리즘은 All-to-All의 3중 반복문으로 구성되어 있어 비교적 이해가 쉽다.
다른 알고리즘으로 접근하는 것을 추가로 알아봐야겠다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준]1916 최소 비용 구하기(Python) (0) | 2024.01.19 |
---|---|
[백준]1865 웜홀(Python) (0) | 2024.01.18 |
[백준]11657 타임머신(Python) (1) | 2024.01.15 |
[백준]11404 플로이드(Python) (0) | 2024.01.14 |
[백준]1753 최단경로(Python) (1) | 2024.01.13 |