백준/실버

[백준 10971번] 외판원 순회 2 (C++)

게임개발기원 2025. 3. 8. 17:49

문제링크 : https://www.acmicpc.net/problem/10971

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, answer = INT_MAX, start;
int arr[11][11];
bool visited[11];

void dfs(int idx, int cost, int depth)
{
    if(depth==n-1) //최대 깊이 도달
    {
        if(arr[idx][start])
        {
            answer = min(answer, cost + arr[idx][start]);
            return;
        }
    }

    for(int i=0; i<n; i++)
    {
        if(visited[i] || !arr[idx][i]) continue;
        visited[i] = 1; //현재 숫자 선택
        dfs(i, cost + arr[idx][i], depth+1);
        visited[i] = 0; //백트래킹 (선택 취소)
    }

}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin >> arr[i][j];
        }
    }
    
    for(int i=0; i<n; i++)
    {
        start = i;
        visited[i] = 1;
        dfs(i, 0, 0);
        visited[i] = 0;
    }

    cout << answer;
    return 0;
}

 

백트래킹을 살짝 응용한 문제이다.

백트래킹의 재귀함수에 깊이 뿐만 아니라, 현재 인덱스와 비용도 같이 넘겨주어야 한다.

또한 모든 위치를 기준으로 비용을 측정하기에, start를 따로 저장하여 모든 케이스에 대해 재귀함수를 돌려주어야 한다.