본문 바로가기

Algorithm/BOJ

[BOJ] 10971. 외판원 순회 2

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)

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1987. 알파벳  (6) 2022.10.07
[BOJ] 2529. 부등호  (1) 2022.10.06
[BOJ] 15686. 치킨 배달  (0) 2022.10.03
[BOJ] 1463. 1로 나누기  (0) 2022.09.28
[BOJ] 1806. 부분합  (2) 2022.09.22