티스토리 뷰

백준/실버

[백준 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를 따로 저장하여 모든 케이스에 대해 재귀함수를 돌려주어야 한다.

 

'백준 > 실버' 카테고리의 다른 글

[백준 6603번] 로또 (C++)  (0) 2025.03.21
[백준 2529번] 부등호 (C++)  (0) 2025.03.10
[백준 10974번] 모든 순열 (C++)  (0) 2025.03.07
[백준 10819번] 차이를 최대로 (C++)  (0) 2025.03.05
[백준 1063번] 킹 (C++)  (0) 2025.03.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함