April 27, 2021 ( last updated : April 27, 2021 )
비트마스크
알고리즘
https://github.com/sneakstarberry/
[백준] 2098번 외판원 순회
외판원이 순회할 때의 최소 순회 비용을 나타내라
비트마스크를 응용하여 손쉽게 풀 수 있다.
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 987654321
int N, W[20][20], DP[20][1 << 20];
int dfs(int node, int visit) {
if (visit == ((1 << N) - 1)) {
return W[node][0];
}
if (DP[node][visit] != INF) {
return DP[node][visit];
}
for (int i = 0; i < N; i++) {
if ((visit & (1 << i)) == 0 && (W[node][i] != 0)) {
DP[node][visit] =
min(DP[node][visit], dfs(i, (visit | (1 << i))) + W[node][i]);
}
}
return DP[node][visit];
}
int main() {
cin >> N;
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
W[i][j] = INF;
}
for (int j = 0; j < (1 << 20); j++) {
DP[i][j] = INF;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int tmp;
cin >> tmp;
if (tmp != 0) {
W[i][j] = tmp;
}
}
}
cout << dfs(0, 1);
return 0;
}
Originally published April 27, 2021
Latest update April 27, 2021
Related posts :