알고리즘 모음(C++)

백준 2098 - 외판원 순회(C++) 본문

백준

백준 2098 - 외판원 순회(C++)

공대생의 잡다한 사전 2023. 2. 4. 20:12

문제 링크입니다. 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