티스토리 뷰
문제링크 : 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 |