코드
from sys import stdin, maxsize
input = stdin.readline
def dfs(now, cost, cnt):
global ans
if cnt == N:
if w[now][0]:
cost += w[now][0]
if cost < ans:
ans = cost
return
for i in range(N):
if not visited[i] and w[now][i]:
visited[i] = 1
dfs(i, cost + w[now][i], cnt + 1)
visited[i] = 0
N = int(input())
w = [list(map(int, input().split())) for _ in range(N)]
visited = [0]*N
visited[0] = 1
ans = maxsize
dfs(0,0,1)
print(ans)
결과
풀이 방법
- 현재 도시로부터 방문 가능한 도시들을 DFS로 방문하며 비용을 계산하고 최소비용을 찾는 문제이다.
- 모든 도시를 방문한 경우(cnt == N) 시작 도시로 돌아갈 수 있는지 확인하고 가능하다면 시작도시로 돌아가는 비용을 추가한 후 최소비용이라면 갱신한다.
- 도시를 시작 도시를 제외하고 여러 가지 순서로 방문하기 때문에 현재 도시에서 다른 도시를 DFS로 방문한 이후(DFS return문 수행 후)에는 방문한 도시를 미방문 처리해야한다 (
백트래킹
)