알고리즘 풀이/백준

[ 백준 10971 ] 외판원 순회 2 - Python

12.tka 2020. 5. 27. 23:44
728x90

문제 보기

이 문제는 TSP(Traveling Salesman problem) 문제이다.

 

여러 도시들이 있고 한 도시에서 다른 도시로 이동하는 비용이 모두 주어졌을 때, 모든 도시들을 단 한 번만 방문하고 원래 시작점으로 돌아오는 최소 비용의 이동 순서를 구하는 것이다.

 

한 붓 그리기로 유명한 해밀턴 경로와 유사하며, 다시 출발점으로 돌아오는 코드만 추가하면 된다.

 

풀이 과정은 아래 순서를 따르며 dfs를 통해서 구현하였다.

1. 각 번호에서 출발하여 제자리로 돌아오는 값을 구한다.

2. 1번 과정을 반복하면서 최솟값을 업데이트한다.


 

코드

import sys


def dfs(start, next, value, visited):
    global min_value

    if len(visited) == N:
        if travel[next][start] != 0:
            min_value = min(min_value, value + travel[next][start])
        return

    for i in range(N):
        if travel[next][i] != 0 and i != start and i not in visited:
            visited.append(i)
            dfs(start, i, value + travel[next][i], visited)
            visited.pop()


if __name__ == "__main__":

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

    min_value = sys.maxsize

    # 각 번호에서 시작
    for i in range(N):
        dfs(i, i, 0, [i])

    print(min_value)

 

※ dfs 함수에서 min_value보다 이미 값이 큰 경우는 무시하는 것이 더 빠르게 결과를 도출할 수 있습니다.

728x90

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[ 백준 1991 ] 트리 순회 - Python  (0) 2020.05.29
[ 백준 1697 ] 숨바꼭질 - Python  (2) 2020.05.29
[백준 1629] 1629] 곱셈 - Python  (4) 2020.05.29
[ 백준 1074 ] Z - Python  (4) 2020.05.28
[ 백준 5430 ] AC - Python  (0) 2020.05.26