$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20, M = 1 << N;
int n;
int w[N][N];
int f[M][N]; //从 0 走到 j 这个点,走过的路径状态是 i 的最小值
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; //从 0 走到 0 这个点,走过的路径状态是 1 的最小值
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-(1<<j))>>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;
}