-
[백준 10971] 외판원 순회2백준/DP 2023. 3. 10. 13:02
외판원 순회는 풀 수 있는 방법이 많다
하지만 N값이 커지면, 도시의 개수가 많아지면 브루트포스와 백트래킹
그러니까 완전탐색 방식으로는 시간초과가 뜬다
따라서 N값이 커지면 dp랑 비트마스크를 써야하는데
(사실 비트마스크는 필수가 아니다)
이 문제는 N값이 작으므로 백트래킹으로 해도 충분히 해결되었다
그냥 dfs 코드를 개조해주면 된다
주의할 점은
만약 배열의 원소값이 0이면 이건 길이 없는거라 예외처리를 해줘야한다
즉 if문에 길이 있을때 조건을 추가해야함
모든 정점을 다 방문했으면 그때서야 전역변수인 MIN을 건들 수 있게 된다
#include <iostream> #include <limits.h> #define SIZE 11 using namespace std; int arr[SIZE][SIZE]; bool visited[SIZE]; int MIN; int N; bool check() { for (int i = 1; i <= N; i++) { if (!visited[i]) return false; } return true; } void DFS(int sum,int start) { if (check()) { if (arr[start][1]>0 && sum+arr[start][1] < MIN) { MIN = sum + arr[start][1]; } return; } for (int i = 1; i <= N; i++) { if (!visited[i] && arr[start][i]>0) { visited[i] = true; DFS(sum+arr[start][i],i); visited[i] = false; } } return; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); MIN = INT_MAX; cin >> N; for (int i = 1; i <= N; i++) { for (int k = 1; k <= N; k++) { cin >> arr[i][k]; } } visited[1] = true; DFS(0, 1); cout << MIN; return 0; }
'백준 > DP' 카테고리의 다른 글
[백준 12865] 평범한 배낭 (01 배낭문제) (0) 2024.02.17 [백준 2579] 계단 오르기 (0) 2024.02.08 [백준 1010] 다리놓기 (nCr문제) (0) 2024.02.07 [백준 12847] 꿀 아르바이트 (0) 2023.07.05 [백준 11660] 구간 합 구하기 5 (0) 2023.06.30