알고리즘/BOJ

백준 2098번 외판원 순회

꾸준함. 2018. 3. 11. 00:00

문제 링크입니다: https://www.acmicpc.net/problem/2098

http://jaimemin.tistory.com/365와 비슷한 문제였습니다.

다른점은 다시 해당 도시로 돌아오는 경로도 더해줘야하고 (i,j)와 (j,i)가 대칭이 아니라는 점이였습니다.


#include <iostream>

#include <algorithm>

#include <cstring> //memset

using namespace std;

 

const int MAX = 16;

const int INF = 987654321;

 

int N;

int W[MAX][MAX];

int cache[MAX][1 << MAX];

 

int TSP(int here, int visited)

{

        //기저 사례: 모든 도시를 다 방문했을 때는 0번 도시로 돌아가고 종료

        if (visited == (1 << N) - 1)

        {

               if (W[here][0] != 0)

                       return W[here][0];

               return INF;

        }

        //메모이제이션

        int &result = cache[here][visited];

        if (result != -1)

               return result;

        result = INF;

        //다음 방문할 도시를 전부 시도

        for (int next = 0; next < N; next++)

        {

               //이미 방문한 도시

               if (visited & (1 << next) || W[here][next]==0)

                       continue;

               int candidate = W[here][next] + TSP(next, visited + (1 << next));

               result = min(result, candidate);

        }

        return result;

}

 

int main(void)

{

        cin >> N;

        if (N<2 || N>MAX)

               exit(-1);

 

        for (int i = 0; i < N; i++)

               for (int j = 0; j < N; j++)

                       cin >> W[i][j];

 

        int     result = INF;

        memset(cache, -1, sizeof(cache));

        cout << TSP(0, 1) << endl;

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 11060번 점프 점프  (2) 2018.03.11
백준 2302번 극장 좌석  (0) 2018.03.11
백준 2631번 줄세우기  (0) 2018.03.10
백준 10164 격자상의 경로  (0) 2018.03.10
백준 2011 암호코드  (2) 2018.03.09