[BOJ] 외판원 순회

Date:

[BOJ] 외판원 순회

Problem URL : 외판원 순회

#include <algorithm> 
#include <iostream>
#define INF 1e9
#define MAX 16

using namespace std;

int map[MAX][MAX];
int dp[MAX][1 << MAX];//비트마스크, i번째 도시에 방문여부에 따라 i번째 비트를 1(방문),0(미방문)으로 표현
int n;

int tsp(int current, int visited) {
    //현재 도시와 방문한 도시들이 같으면 dp 값이 0이 아니다.
    if (dp[current][visited] != 0)
        return dp[current][visited];
    if (visited == (1 << n) - 1) {
        // 마지막 도시에서 처음 도시로 갈 수 있는지 확인
        return dp[current][visited] = map[current][0] ? map[current][0] : INF;
    }
    int ret = INF;
    for (int i = 0; i < n; i++) {
        // 갈 수 있고 (map 값이 0이 아니고), 방문한 적이 없으면 방문하도록 한다.
        if (map[current][i] != 0 && !(visited & (1 << i)))
            ret = min(ret, map[current][i] + tsp(i, visited | (1 << i)));
    }
    return dp[current][visited] = ret;
}

int main(void) {
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cin >> map[i][j];
    }
    cout << tsp(0, 1);
    return 0;
}

댓글