몽상실현개발주의

[BOJ] 10971 / 외판원 순회2 / Python 파이썬 본문

Algorithm PS/BOJ

[BOJ] 10971 / 외판원 순회2 / Python 파이썬

migrationArc 2021. 7. 25. 18:13

[BOJ] 10971 / 외판원 순회2 / Python 파이썬

[BOJ] 10971 / 외판원 순회2 / Python 파이썬

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

 

풀이

가장 기본적인 형태의 Traveling Salesman problem(TSP) 문제 이다.

 

visited 로 방문한 경로를 check 하며 DFS 탐색하여 해결하였다.

 

# 한 도시에서 출발해 N개의 도시를 모두 거쳐 다시 원래의 도시로 돌아오는 순회 여행 경로를 계획하려고 한다.
# 가장 적은 비용을 들이는 여행 계획을 세우고자 한다.

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

visited = [0] * N
res = 123456789

add = 0


def DFS(f, add, visited):
    global res
    if add > res:
        return
    if sum(visited) == N-1:
        if maps[f][0]:
            res = min(res, add+maps[f][0])
        return

    for i in range(1, N):
        if maps[f][i] and visited[i] == 0:
            visited[i] = 1
            DFS(i, add+maps[f][i], visited)
            visited[i] = 0


for i in range(1, N):
    if maps[0][i]:
        visited[i] = 1
        DFS(i, maps[0][i], visited)
        visited[i] = 0

print(res)

 

 

Comments