반응형

문제 링크

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j로 가기 위한 비용을 나타낸다. 항상 순회할 수 있는 경우만 입력으로 주어진다.

www.acmicpc.net

 

풀이 ) DFS

  TSP 문제이다.

  도시의 수가 10개 이하이므로 DFS로 풀 수 있다.

  방문 여부를 나타내는 visited 배열을 만들어서 각 도시를 방문했을 때, 방문하지 않았을 때 순서대로 재귀를 하고 모든 도시를 방문하고 마지막 도시에서 시작 도시로 돌아올 수 있으면 그 값을 기존의 결괏값과 비교해 최솟값을 구한다.

 

#include <cstdio>
#include <algorithm>
using namespace std;

int n, city[10][10], visited[10], ans = 1e9;

void dfs(int curr, int len, int tot);

int main(void)
{
  scanf("%d", &n);
  for(int i = 0; i < n; ++i)
    for(int j = 0; j < n; ++j)
      scanf("%d", city[i]+j);

  dfs(0, 0, 0);
  if(ans == 1e9)
    printf("-1\n");
  else
    printf("%d\n", ans);
  return 0;
}

void dfs(int curr, int len, int tot)
{
  if(len == n-1){
    if(city[curr][0])
      ans = min(ans, tot+city[curr][0]);
  }
  else{
    for(int i = 1; i < n; ++i)
      if(city[curr][i] && !visited[i]){
        visited[i]++;
        dfs(i, len+1, tot+city[curr][i]);
        visited[i]--;
      }
    }
}
반응형

+ Recent posts