본문 바로가기

ps(알고리즘)

외판원 순회

 

모든 가능한 경로를 탐색하면 최대 16!의 시간이 걸려서 시간초과가 뜰 것이다.

더 효율적으로 처리하기 위해서 dp를 쓸 것이다.

현재까지 방문한 노드의 상태를 2진법 16자리수로 비트마스킹을 하고, 현재 방문한 점을 이용해서

dp[state][current] 이런식으로 쓸 것이다.

만약 이 dp값이 존재하며 그 이후는 탐색이 필요하지 않기 때문에 시간을 줄일 수 있다.

탐색은 dfs로 돌리면 된다.

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int N;
int w[100][100];
int dp[100000][100];
int big = 100000000;
int dfs(int state, int curr)
{
    //printf("%d %d\n",state,curr);
    if(dp[state][curr]!=0){
        return dp[state][curr];
    }
    if(state == (1<<N)-1){
        if(w[curr][1]==0) return big;
        return w[curr][1];
    }
    dp[state][curr] = big;
    int minv = big;
    int ss = state;
    for(int i=1;i<=N;i++)
    {
        if(ss%2==0) //i번 아직 방문안함
        {
            if(w[curr][i]!=0)
            {
                int ddd=pow(2,i-1);
                int x = w[curr][i] + dfs(state+ddd,i);
                if(minv>x) minv = x;
            }
        }
        ss/=2;
    }
    dp[state][curr] = min(minv,dp[state][curr]);
    return dp[state][curr];
}
int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            scanf("%d",&w[i][j]);
        }
    }
    printf("%d",dfs(1,1));
}

해결 코드이다.

'ps(알고리즘)' 카테고리의 다른 글

히스토그램  (0) 2024.11.07
제곱 ㄴㄴ수  (0) 2024.11.04
최솟값과 최댓값  (0) 2024.10.30
k번째 수  (1) 2024.10.29
구슬 탈출 2  (0) 2024.10.28