알고리즘/백준
[백준]1956 운동(Python)
cha_eyoon
2024. 1. 17. 15:12
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중 반복문으로 구성되어 있어 비교적 이해가 쉽다.
다른 알고리즘으로 접근하는 것을 추가로 알아봐야겠다.