题目链接:
思路:首先是floyd预处理出任意两点之间的最短距离。dp[state1][state2][u]表示在该状态state1(已经访问过的景点)、state2(手中有的景点的票)、目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1<<k)-1][state][1]了(0<=state<(1<<n))。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define inf 1<<30 9 #define FILL(a,b) memset(a,b,sizeof(a))10 11 int dp[1<<9][1<<9][55];//访问过的+收集的票+当前顶点12 int pos[55],time[9],f_time[9],map[55][55];13 int Mask[55];14 int n,m,k,ans;15 16 void floyd()17 {18 for(int k=1; k<=n; k++)19 for(int i=1; i<=n; i++)20 for(int j=1; j<=n; j++)21 if(map[i][k]!=inf&&map[k][j]!=inf&&map[i][k]+map[k][j]