[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 2098번 : 외판원 순회*

HiStar__ 2020. 9. 17. 16:47

문 제

 

소 스  코 드

#include <iostream>
#include <algorithm>

constexpr int INF{ 1'000'000'000 };

int N;
int city[16][16];
int dp[16][1 << 16];

int Circuit(const int& index, const int& bmask) {

	if (bmask == (1 << N) - 1) {
		if (0 == city[index][0]) return INF;
		else					 return city[index][0];
	}

	int& ref{ dp[index][bmask] };
	if (-1 != ref) return ref;

	ref = INF;
	for (int i = 0; i < N; ++i) {
		if (bmask & (1 << i))		continue;
		if (0 == city[index][i])	continue;
		ref = std::min(ref, Circuit(i, bmask | (1 << i)) + city[index][i]);
	}

	return ref;
}

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	std::cin >> N;

	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			std::cin >> city[i][j];
		}
	}

	for (int i = 0; i < N; ++i) std::fill_n(dp[i], 1 << 16, -1);


	std::cout << Circuit(0, 1);

}

 

풀 이

 

  • dp와 비트마스크의 활용

더보기

모든 방문 경로를 dp배열에 담기 위해서는,

1. 한 번 방문한 도시로는 돌아가지 않기 때문에, 마지막으로 방문한 도시로 경로를 나누는데

모든 탐색 후에 최솟 값이 담겨야 하기 때문에,

비트를 통하여 각 마을의 방문 여부를 확인하고 비교해 주면 된다.

 

출 력 값

 

 

문 제  출 처

문제 링크 : www.acmicpc.net/problem/2098

 

2098번: 외판원 순회

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

www.acmicpc.net

 

'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글

[BAEKJOON] 17404번 : RGB 거리 2  (0) 2020.09.19
[BAEKJOON] 1086번 : 박 성 원*  (0) 2020.09.18
[BAEKJOON] 11723번 : 집 합  (0) 2020.09.16
[BAEKJOON] 1956번 : 운 동  (0) 2020.09.15
[BAEKJOON] 10217번 : KCM Travel*  (0) 2020.09.15