-
[Python] 백준 17182 우주 탐사선알고리즘/문제풀이 2021. 8. 7. 18:44728x90
1. 문제 링크
https://www.acmicpc.net/problem/17182
2. 문제 요약
모든 행성을 탐사하기 위한 최소 시간을 출력한다.
3. 아이디어 정리
- 플로이드 와샬. 모든 정점 최단 거리 구하기
- 행성을 백트래킹으로 탐색하여 모든 행성 방문하여 최소 시간 구하기
참고 - 플로이드와샬
모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산한다. - 특정 노드를 거쳐 가는 경우 사용
플로이드 워셜 점화식
각 단계마다 특정한 노드 k를 거쳐 가는 경우를 확인한다.
- a에서 b로 가는 최단 거리, a에서 k를 거쳐 b로 가는 거리 비교
4. 문제 풀이
4-1. 내 풀이
import sys def recursive(pos, cnt, cost): global result if cnt == N: result = min(result, cost) return for next in range(N): if not visit[next]: visit[next] = True recursive(next, cnt + 1, cost + graph[pos][next]) visit[next] = False N, K = map(int, sys.stdin.readline().split()) graph = [[*map(int, sys.stdin.readline().split())] for _ in range(N)] # 1. 플로이드 와샬. 모든 정점 최단 거리 구하기 for k in range(N): for i in range(N): for j in range(N): graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]) visit = [False] * N result = int(1e9) visit[K] = True # 2. 행성을 백트래킹으로 탐색하여 모든 행성 방문하여 최소 시간 구하기 recursive(K, 1, 0) print(result)
5. 결론
- 플로이드 와샬을 이용해서 모든 정점과 최소값을 구한 뒤, 모든 행성을 방문하는 문제
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] Programmers 로또의 최고 순위와 최저 순위 (0) 2021.08.14 [Python] 백준 17609 회문 (1) 2021.08.14 [Python] 백준 14719 빗물 (0) 2021.08.07 [Python] 백준 16234 인구 이동 (0) 2021.08.07 [Python] 백준 18513 샘터 (0) 2021.07.31