91. 最短Hamilton路径

#include

using namespace std;

const int N=20,M=1<<N;

int n;
int w[N][N];
int f[M][N];

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>w[i][j];
        }
    }
    
    memset(f,0x3f,sizeof f);
    f[1][0]=0;
    
    for(int i=0;i<1<<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i>>j&1)
            {
                for(int k=0;k<n;k++)
                {
                    if(i>>k&1)
                    {
                        f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
                    }
                }
            }
        }
    }
    
    cout<<f[(1<<n)-1][n-1]<<endl;
    
    return 0;
}

状态压缩指的是使用二进制来表示状态

大数组一般定义在全局变量中,否则容易爆栈

1表示经过,0表示没有经过

w数组存的是两个点之间的距离,代码里面是指k到j的距离

ios::sync_with_stdio(false);

用了上面这一行代码scanf就不可以使用了

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

这个是输入输出加速的完整版本

你可能感兴趣的:(#,acwing算法基础,c++,算法,开发语言)