반응형
[알고리즘] 백준 1956 '운동' 풀이 _ 파이썬
백준 1956 운동 난이도 : 골드 4유형 : 그래프 (플로이드 와샬/다익스트라) 방향성 있는 그래프에서 최소 비용으로 사이클을 돌 수 있는지 구하는 문제
velog.io
처음 문제를 보고 푸는 방법을 몰라 위 블로그에서 도움을 얻었다.(변형된 다익스트라도 위 블로그에 있습니다)
플로이드 알고리즘으로 싸이클 또한 확인할 수 있다는 것을 알게 되었다.
처음 2차원 배열에 값을 저장할 때 본인 값을 0으로 수정하지 않고 그대로 최댓값으로 설정해놓고
알고리즘을 돌리면 다른 거쳐가는 노드들을 통해 다시 자신한테 돌아오는 경로가 있으면 값이 갱신이 된다.
이것을 통해 싸이클을 판별할 수 있다.
import sys
input = sys.stdin.readline
vil,edges = map(int,input().split())
graph = [[1e9 for i in range(vil+1)] for j in range(vil+1)] #비용 값 저장
for i in range(edges):
fst,scd,thd = map(int,input().split())
graph[fst][scd] = thd
for k in range(1,vil+1):
for i in range(1,vil+1):
for j in range(1,vil+1):
graph[i][j] = min(graph[i][j],graph[i][k]+graph[k][j]) #플로이드 알고리즘
std = 1e9
for i in range(1,vil+1):
if std>graph[i][i]: #싸이클이 존재할 때
std = graph[i][i]
print(std if std!= 1e9 else -1)
위 블로그에서 플로이드알고리즘 외에도 변형된 다익스트라로 더 효율적으로 풀이된게 있어 나중에는 다양하게 풀이 할 수있게끔 공부 열심히 해야겠다
반응형
'알고리즘 문제들 으악 > 백준' 카테고리의 다른 글
| [python]11727번 2×n 타일링 2 (0) | 2023.01.25 |
|---|---|
| [python]7662번 이중 우선순위 큐 (0) | 2023.01.22 |
| [python]5014번 스타트링크, 값 범위 설정의 중요성 (0) | 2023.01.20 |
| [python]1074번 Z,최적화 (0) | 2023.01.19 |
| [python]11724번 연결 요소의 개수,무방향=양방향 그래프 (0) | 2023.01.18 |