Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 항해99솔직후기 #항해99 #부트캠프추천
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 스파르타코딩클럽 #크롤링 #스크래핑
Archives
- Today
- Total
이모저모
플로이드 워셜 연습 - 운동(백준 1956) 본문
문제: https://www.acmicpc.net/problem/1956
이 문제에서 찾아야 하는 최단경로는, 출발지로 돌아와야 하는 순환경로라는 점이 다른 최단거리 구하는 점과 다르다. 처음에는 뭔가 복잡하게 접근할 뻔했는데, 생각해보니 자기 자신으로 오는 거리를 처음에 0으로 초기화하지만 않으면 되는 것이었다.
보통 다른 최단경로문제를 풀 때는 자신에게로 오는 거리를 처음부터 0으로 초기화해서 애초에 다른 아이를 경유하는 경우는 고려도 하지 않았다. 하지만 다른 노드에 대해서와 마찬가지로 INF(매우 큰 수)로 초기화해두면, 다른 노드로 갈 때 경유지를 고려하는 것과 마찬가지의 작업이 자기 자신에 대해서도 일어날 수 있다.
+ 지금 플로이드 워셜을 공부하던 터라 이 문제를 플로이드 워셜로 풀었지만, 다른 방식으로 좀 더 짧은 시간안에 풀 수는 없을까 하는 궁금함이 있다.
import sys
V, E = map(int, sys.stdin.readline().split())
INF = int(1e8)
graph = [[INF] * (V+1) for _ in range(V+1)]
# 최단거리를 갱신해갈 2차원 배열
for _ in range(E):
u, v, w = map(int, sys.stdin.readline().split())
graph[u][v] = w
# 경유지 고려하며 최단거리 갱신하기
for k in range(1, V+1):
for i in range(1, V+1):
for j in range(1, V+1):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
answer = INF
# 자신에게로 향하는 거리들 구해보고 그 중 최소인 것으로 answer 갱신
for i in range(1, len(graph)):
if graph[i][i] == INF:
continue
answer = min(answer, graph[i][i])
# 정답 제출 / 자신에게로 오는 게 모두 불가능했다면 -1리턴
if answer == INF:
print(-1)
else:
print(answer)
'coding > 알고리즘,자료구조' 카테고리의 다른 글
동적 계획법 연습 - 도둑질(프로그래머스) (0) | 2022.02.09 |
---|---|
동적 계획법 연습 - 등굣길(프로그래머스) (0) | 2022.02.08 |
플로이드-워셜 연습 - 정확한 순위(이코테 38) (0) | 2022.02.08 |
다익스트라 연습 - 최단경로(백준 1753) (0) | 2022.02.08 |
다익스트라 연습 - 네트워크 딜레이 타임 (0) | 2022.02.07 |
Comments