TSP 문제 의 상 압 dp

    TSP  (Traveling Salesman Problem)            。
            N   ,           ,          
      ,              ,         。  ,2<=N<=15。

n 의 이 범 위 를 보면 많은 경우 에 상 압 입 니 다. 모든 가능 한 노선 이 모두 있 기 때 문 입 니 다 (n - 1)!종, 이 건 값 이 너무 커 요.상 압 은 상 태 를 하나의 정수 로 압축 한 후에 이 정수 로 상 태 를 표시 하 는 것 이다.가방 에 있 는 바 이 너 리 최적화 처럼 모든 요소 의 선택 과 선택 하지 않 는 것 이 바 이 너 리 에 대응 합 니 다.
먼저, 우 리 는 상 태 를 설계 하려 고 합 니 다. 현재 방문 한 정점 의 집합 이 S 라 고 가정 하고 현재 있 는 정점 은 v 이 며, dp [S] [v] 로 v 에서 출발 하여 남 은 모든 정점 을 방문 하고 마지막 으로 정점 0 으로 돌아 가 는 경로 의 총 과 최소 값 을 표시 합 니 다.v 에서 출발 하여 아직 방문 하지 않 은 정점 까지 갈 수 있 습 니 다. 경 계 는 모든 정점 을 방문 하고 정점 0 으로 돌아 가 는 것 입 니 다.전달 식 을 보기 전에 지식 을 알 아야 하 는데......................................................
일부 집합 은 빈 집합 을 나타 낸다.S 와 T 의 집합 S * 8746 ° T – > S | T 집합 S 와 T 의 집합 S ∩ T – > S & T
이상 의 지식 이 있 으 면 전달 식 은 이해 하기 쉽다.전달 식 은 dp [V] [0] = 0 이다.(경계) dp [S] [v] = min {dp [S ∪ {u}] [u] + d [u] [v] | u 는 S} 에 속 하지 않 습 니 다.
ok, 상 code (^ ^) 우선 우 리 는 전달 식 으로 기억 화 검색 을 쓸 수 있 습 니 다.
int rec(int S,int v)
{
    if(dp[S][v]>=0)
        return dp[S][v];
    if(S==(1<1&&v==0)  //  
        return dp[S][v] = 0;
    int res = inf;
    for(int u = 0; u < n; ++u)
        if(!(S>>u&1)) //  u   S  
        //        u
        res = min(res,rec(S|1<return dp[S][v] = res; //   
}

void solve()
{
    memset(dp,-1,sizeof(dp));
    printf("%d
"
, rec(n,0)); }

그러나 이 문제 에서 임의의 두 정수 i 와 j 에 대해 그들 이 대응 하 는 집합 이 S (i) 를 S (j) 에 포함 시 키 면 i < = j 가 있 기 때문에 우 리 는 순환 방식 으로 쓸 수 있다.
void solve()
{
    for(int S = 0; S < 1<//   
    }
    dp[(1<0] = 0; //    
    //     
    for(int S = (1<2; S >= 0; ++S){
        for(int v = 0; v < n; ++v){
            for(int u = 0; u < n; ++u){
                if(!(S>>u&1)){ //  u   S  
                    dp[S][v] = min(dp[S][v],dp[S|1<printf("%d
"
,dp[0][0]); }

좋은 웹페이지 즐겨찾기