알고리즘 문제 해결/BOJ

[브루트 포스] BOJ 10971 외판원 순회 2

jmkimmessi 2021. 10. 19. 00:00
반응형

https://www.acmicpc.net/problem/10971

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

 

문제 해결 알고리즘

 

DFS를 활용해 백트래킹 기법으로 모든 도시들을 탐색한 후에 가장 적은 비용을 출력해준다.

 

소스 코드

 

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

int N; 
int W[11][11];
bool visited[11];
int result = 99999999;

bool visitedCheck(){
  for(int i=2;i<=N;i++){
    if(!visited[i]) return false;
  }
  return true;
}

void dfs(int x, int sum){
    if(visitedCheck()){
      if(W[x][1]) result = min(result, sum+W[x][1]);
    }

  for(int i=2;i<=N;i++){
    if(visited[i] || !W[x][i]) continue;
    visited[i] = true;
    dfs(i, sum+W[x][i]);
    visited[i] = false;
  }
}

int main(){
  cin >> N;

  for(int i=1;i<=N;i++){
    for(int j=1;j<=N;j++){
      cin >> W[i][j];
    }
  }

  
  dfs(1, 0);

  cout << result;


}
반응형