POJ 3311 Hie with the Pie:TSP(旅行商)【節點可多次經過】

Leohh發表於2017-08-17

題目連結:http://poj.org/problem?id=3311

題意:

  你在0號點(pizza店),要往1到n號節點送pizza。

  每個節點可以重複經過。

  給你一個(n+1)*(n+1)的鄰接矩陣,表示各點之間距離。

  問你送完所有pizza再返回店裡的最短路程。

 

題解:

  與傳統TSP相比,唯一變化的條件是每個節點可以經過多次。

  所以也就是轉移的時候不用再判斷要去的節點j是否去過。

  先floyd預處理出兩點之間最短路。然後把(!((state>>j)&1))去掉,套TSP模板就好啦。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stack>
 5 #define MAX_N 15
 6 #define MAX_S (1<<13)
 7 #define INF 10000000
 8 
 9 using namespace std;
10 
11 int n;
12 int ans;
13 int dp[MAX_S][MAX_N];
14 int dis[MAX_N][MAX_N];
15 
16 void floyd()
17 {
18     for(int k=0;k<=n;k++)
19     {
20         for(int i=0;i<=n;i++)
21         {
22             for(int j=0;j<=n;j++)
23             {
24                 if(i!=j && j!=k && i!=k)
25                 {
26                     dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
27                 }
28             }
29         }
30     }
31 }
32 
33 void read()
34 {
35     for(int i=0;i<=n;i++)
36     {
37         for(int j=0;j<=n;j++)
38         {
39             cin>>dis[i][j];
40         }
41     }
42 }
43 
44 void solve()
45 {
46     floyd();
47     memset(dp,-1,sizeof(dp));
48     dp[0][0]=0;
49     for(int state=0;state<(1<<(n+1));state++)
50     {
51         for(int i=0;i<=n;i++)
52         {
53             if(dp[state][i]!=-1)
54             {
55                 for(int j=0;j<=n;j++)
56                 {
57                     if(dp[state|(1<<j)][j]==-1 || dp[state|(1<<j)][j]>dp[state][i]+dis[i][j])
58                     {
59                         dp[state|(1<<j)][j]=dp[state][i]+dis[i][j];
60                     }
61                 }
62             }
63         }
64     }
65     ans=INF;
66     for(int i=0;i<=n;i++)
67     {
68         if(dp[(1<<(n+1))-1][i]!=-1)
69         {
70             ans=min(ans,dp[(1<<(n+1))-1][i]+dis[i][0]);
71         }
72     }
73 }
74 
75 void print()
76 {
77     cout<<ans<<endl;
78 }
79 
80 int main()
81 {
82     while(cin>>n)
83     {
84         if(n==0) break;
85         read();
86         solve();
87         print();
88     }
89 }

 

相關文章