AcWing 91. 最短Hamilton距离

状压dp,模板
f[i][j]表示以i为当前状态,j为终点的路径长度,属性:min
#include<bits/stdc++.h>
using namespace std;

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

int f[M][N],weight[N][N];

int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>weight[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)//判断j能否作为终点
                for(int k=0;k<n;k++)
                    if((i-(1<<j))>>k&1)//判断以j为终点的点能否由以k为终点的点转移过来
                        f[i][j]=min(f[i][j],f[i-(1<<j)][k]+weight[k][j]);
    
    cout<<f[(1<<n)-1][n-1];
    return 0;
}

posted @ 2022-05-10 12:50  xhy666  阅读(51)  评论(0)    收藏  举报