AcWing91. 最短Hamilton路径

AcWing91. 最短Hamilton路径

一、题目链接及描述

题目传送门
AcWing91. 最短Hamilton路径_第1张图片

二、题目思路

  • 若当前使用过的点的状态是i(二进制数字),可以用来表示用过的点有哪些;j表示最后一个用到的点是哪一个。那么可以用f[i,j]表示这种情况下,最短路径的长度是多少。然后最终的答案就是f[(1<
  • 最小可确定状态:f[1,0]=0;状态转移:所有f[i,j]可以从更小的状态到达,当f[i,j]还没求出来的时候,可以根据i这个二进制数判断之前经过了哪些点,接着就可以按照倒数第二个点是哪一个点来进行划分,然后最终答案就是所有的f[i-(1<

三、代码

#include
#include
using namespace std;
const int N=20,M=1<<20;
int weight[N][N];
int dp[M][N];
int n;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    cin>>weight[i][j];
    memset(dp,0x3f,sizeof dp);
    dp[1][0]=0;
    for(int i=2;i<1<<n;i++)
    for(int j=0;j<n;j++)
    if(i&(1<<j))
    {
        int t=i-(1<<j);
        for(int k=0;k<n;k++)
        {
            if(t>>k&1)
            {
                dp[i][j]=min(dp[i][j],dp[t][k]+weight[k][j]);
            }
        }
    }
    cout<<dp[(1<<n)-1][n-1]<<endl;
}

你可能感兴趣的:(AcWing91. 最短Hamilton路径)