본문 바로가기
IT/BOJ

백준(BOJ) 2098 외판원 순회 **

by 빨강자몽 2018. 6. 1.

외판원 순회 알고리즘에 대해 공부하고 푸는 것을 추천한다.



#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 17
#define INF 987654321
#define MOD 1000000
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<float, float> pf;

int n,w[MAX][MAX],dp[MAX][1<<16];
vector<int> v;

int tsp(int cur,int visit)
{
    if(visit==(1<<n)-1)
        return w[cur][1];
    // 모든 정점을 모두 방문하고 마지막으로 원점(1)으로 돌아왔을 때
    
    if (dp[cur][visit] > 0)
        return dp[cur][visit];
    // 이전에 방문한 케이스의 경우 바로 return한다.
    
    int ret=INF;
    
    for(int i=2;i<=n;i++)
    {
        if(w[cur][i]==0)continue;
        // 경로가 없는 경우
        
        if((visit&(1<<(i-1)))!=0)continue;
        // 방문한 도시인 경우
        
        int tmp=w[cur][i]+tsp(i,visit+(1<<(i-1)));
        ret = min(ret, tmp);
        // 다음 도시들을 선택하여 이동하였을때 가장 적은 비용이 드는 경로 선택
    }
    return dp[cur][visit]=ret;
    // 디피에 결과를 저장하고 return한다.
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int k=1;k<=n;k++)
            scanf("%d",&w[i][k]);
    printf("%d",tsp(1,1));
    return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 11062 카드게임 ***  (0) 2018.06.01
백준(BOJ) 2932 표회전 *  (0) 2018.06.01
백준(BOJ) 2987 사과나무 **  (0) 2018.06.01
백준(BOJ) 3190 뱀 **  (0) 2018.06.01
백준(BOJ) 3048 개미 *  (0) 2018.06.01