Notice
Recent Posts
Recent Comments
Link
전자공학 및 알고리즘
백준 2098 - 외판원 순회(C++) 본문
문제 링크입니다. https://www.acmicpc.net/problem/2098
2098번: 외판원 순회
첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j
www.acmicpc.net
유명한 문제인 외판원 순회입니다.
외판원 문제에 대한 설명이 잘나와있습니다. 해당 블로그를 참고해주세요!
자세한 것은 코드를 참고해주세요
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>
#include <map>
#define LL long long
#define pp pair<int, int>
#define F first
#define S second
#define INF 987654321
using namespace std;
int N, ans_bit;
int cost[17][17];
int dp[17][1 << 16];
int dfs(int node, int bit){
if(bit == ans_bit){ //전부 순환했을 경우
if(cost[node][0] == 0) return INF;
else return cost[node][0];
}
if(dp[node][bit] != -1) return dp[node][bit];
dp[node][bit] = INF;
for(int i = 0; i < N; i++){
if(cost[node][i] == 0) continue;
if((bit & (1 << i)) == (1 << i)) continue;
dp[node][bit] = min(dp[node][bit], cost[node][i] + dfs(i, bit | 1 << i));
}
return dp[node][bit];
}
void solve(){
memset(dp, -1, sizeof(dp));
int Cost = dfs(0, 1);
cout << Cost;
}
int main() {
cin.tie(0);
cout.tie(0);
cin >> N;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cin >> cost[i][j];
}
}
ans_bit = (1 << N) - 1;
solve();
return 0;
}
질문 및 조언은 댓글을 남겨주세요
'백준' 카테고리의 다른 글
백준 9086 - 문자열(C++) (0) | 2023.02.08 |
---|---|
백준 1194 - 달이 차오른다, 가자.(C++) (0) | 2023.02.07 |
백준 1202 - 보석 도둑(C++) (0) | 2023.02.04 |
백준 2420 - 사파리 월드(C++) (0) | 2023.02.04 |
백준 17387 - 선분 교차 2(C++) (0) | 2023.02.01 |