알고리즘/문제풀이
[Python] 백준 17182 우주 탐사선
정찡이
2021. 8. 7. 18:44
728x90
1. 문제 링크
https://www.acmicpc.net/problem/17182
17182번: 우주 탐사선
우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위
www.acmicpc.net
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. 결론
- 플로이드 와샬을 이용해서 모든 정점과 최소값을 구한 뒤, 모든 행성을 방문하는 문제
반응형