Algorithm/BOJ

[BOJ] 10971. 외판원 순회 2

츄르릅 2022. 10. 5. 02:02

https://www.acmicpc.net/problem/10971

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

 

 

1. 해결항법

순회라는 조건이 붙었다.

예를 들어 문제의 N이 4라면 시작점에서 부터 순회를 해야하고 4이기 때문에 정사각형의 모형으로 순회를 할 것이다.
이 점을 유의하고 완전탐색 백트래킹 방법으로 하면 된다.

본인도 문제 이해가 어려웠고, 어떻게 순회하면서 재귀를 돌 것인가에 대해서 고민을 엄청 했다.
이에 관련해서는 코드에서 dfs() for문을 확인해보면 된다.

 

 

2. 정답코드

import sys
input = sys.stdin.readline


N = int(input())
maps = [list(map(int, input().split())) for _ in range(N)]


# dfs
def dfs(start, now, num, count):
    global answer
    if count == N:
        if maps[now][start] != 0:
            num += maps[now][start]
            answer = min(answer, num)
        return

    for j in range(N):
        if chk[j] == False and maps[now][j]:
            chk[j] = True
            dfs(start, j, num + maps[now][j], count + 1)
            chk[j] = False


# main
chk = [False] * (N)
answer = sys.maxsize

for i in range(N):
    if chk[i] == False:
        chk[i] = True
        dfs(i, i, 0, 1)
        chk[i] = False

print(answer)