[적용한 알고리즘]
DP, 비트마스크
[아이디어]
http://kks227.blog.me/220787042377 를 참고했습니다.
비트마스킹(Bit Masking)
이번에 쓸 글은 꼭 알고리즘이라고 하기는 뭣한, 테크닉이나 도구라고 봐야 할 듯 싶습니다.비트마스크(Bi...
blog.naver.com
[생각의 흐름 / 절차]
내용
[교훈]
비트마스킹을 이용한 것은 알겠으나, 코드가 정확하게 와닿지는 않는다. 더 공부해야겠다.
<코드>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int IMPOSSIBLE = 1000000000;
int N, W[16][16], dp[16][1 << 16];
int TSP(int current, int visited){
//Base Case : 전부 방문한 경우
if (visited == (1 << N) - 1){
if (W[current][0] != 0) return W[current][0];
return IMPOSSIBLE;
}
int &ret = dp[current][visited];
if (ret != -1) return ret;
ret = IMPOSSIBLE;
for (int i = 0; i < N; i++){
if (visited & (1 << i) || W[current][i] == 0) continue;
ret = min(ret, TSP(i, visited | (1 << i)) + W[current][i]);
}
return ret;
}
int main(){
scanf("%d", &N);
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
scanf("%d", &W[i][j]);
}
}
memset(dp, -1, sizeof(dp));
printf("%d\n", TSP(0, 1));
return 0;
}