在写这道题的时候,为了理解写了详细的注释,也确实对我的思维有所提升;
粘代码方便复习
`#include<bits/stdc++.h>
using namespace std;
int n,f[(1<<20)+2][22],mapp[22][22];
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
cin>>n;
for(int i=0;i<n;i++){ //点从0存
for(int j=0;j<n;j++){
scanf("%d",&mapp[i][j]);
}
}
memset(f,10,sizeof(f));
f[1][0]=0; //起点为0
//f[i][j] 在i排列下 当前走的点为j
for(int i=1;i<(1<<n);i++){ //点从0开始
for(int j=0;j<n;j++){
if((i>>j)&1){ //经过该点
for(int k=0;k<n;k++){
//来的点 来的点不经过j
if(((i^(1<<j))>>k)&1) { //<<的优先级高于^
//确保异或到的点经过k
f[i][j]=min(f[i][j],f[i^(1<<j)][k]+mapp[k][j]);
}
}
}
}
}
cout<<f[(1<<n)-1][n-1];
return 0;
}`