ABOUT ME

Today
-
Yesterday
-
Total
-
  • 10971. 외판원 순회
    Algorithm/Baekjoon 2023. 3. 19. 00:14

    백트래킹 문제이다.

    문제의 핵심은 사이클이 만들어지기 때문에 어디서 시작해도 같은 사이클을 가지게 되니 시작 지점을 고정해놓아도 상관이 없다는 것이다. 따라서 무조건 0으로 시작하도록 고정하였다.

    또 하나 내가 실수한 점이 있는데, 함수 안에서 cost 함수를 대입연산자를 사용하여 더해지는 경우, 그 함수 내에서 cost 값이 i가 변할 때마다 누적된다는 것을 간과하였다. 

    이 문제를 해결하기 위해서는 cost값에 대입연산자를 사용하여 더하지 말고 함수 호출 시에만 더해주어야 한다.

     

    import sys
    input = sys.stdin.readline
    
    def get_routine(start, cnt, cost) :
        global min_cost
        if cost > min_cost :
            return
        if cnt == n-1 :
            if w[start][0] != 0 :
                min_cost = min(min_cost, cost+w[start][0])
            return
        for i in range(1, n) :
            if check[i] == False and w[start][i] != 0 : 
                check[i] = True
                get_routine(i, cnt+1, cost+w[start][i])
                check[i] = False
    
    
    n = int(input())
    
    w = [list(map(int, input().split())) for _ in range(n)]
    min_cost = 10**8
    check = [False for _ in range(n)]
    get_routine(0, 0, 0)
    print(min_cost)

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

    2580. 스도쿠  (0) 2023.03.20
    9663. N-queen  (0) 2023.03.06
    1205. 등수 구하기  (0) 2023.03.06
    1009. 분산처리  (0) 2023.03.01
    11723. 집합  (0) 2023.02.27

    댓글

Designed by nanometre380.