728x90
https://beta.jungol.co.kr/problem/1681?cursor=eyJwcm9ibGVtc2V0Ijo4LCJmaWVsZCI6MiwiaWR4IjoxfQ==
1. 더 이상 탐색하지 않아도 되는 경우를 파악한다.
1) 이동 비용이 구했던 최솟값(ans)보다 크다면 return
2) 갔던 장소는 또 다시 가지 않는다.
#pragma warning(disable:4996)
#include <stdio.h>
#include<algorithm>
using namespace std;
int graph[15][15], n;
int freq[15], ans = 0x7fffffff;
void dfs(int level, int cost, int cnt) // 장소, 비용, 이동 횟수
{
if (ans < cost) return; // 비용이 구했던 최솟값보다 크면 리턴
if (cnt == n) // 회사에 돌아올 차례
{
if (graph[level][1] == 0) return; // 회사로 가지 못하면 리턴
if (ans > cost + graph[level][1]) ans = cost + graph[level][1]; // 최솟값 갱신
return;
}
else // 배달할 장소가 남았다면
{
for (int i = 2; i <= n; i++) // 회사는 마지막에 가야하기 때문에 2부터 시작
{
if (freq[i] != 1 && graph[level][i] != 0) // 참조하지 않았고 다음 장소로 갈 수 있다면
{
freq[i] = 1; // 장소 체크
dfs(i, cost + graph[level][i], cnt + 1); // 장소 번호, 비용, 이동 횟수
freq[i] = 0;
}
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &graph[i][j]);
dfs(1, 0, 1);
printf("%d", ans);
return 0;
}
728x90
'알고리즘' 카테고리의 다른 글
C++ - 동전 자판기(下) (1183) 그리디 (0) | 2023.05.15 |
---|---|
정올 JAVA - 벽장문의 이동 (1409) 백트래킹 (1) | 2023.05.11 |
백준 C++ - 상자넣기 (1965번) DP (0) | 2023.04.29 |
백준 C++ - 정수삼각형(1932) DP (0) | 2023.04.23 |
백준 C++ - 센서(2212) 탐욕법 (0) | 2023.04.18 |