luogu-1171セールスマン問題
#include <cstdio>
#include <algorithm>
struct x{int i,l;};
x a[40][40];
int z[40],zsum=0;
int d[40][40];
int n,minn=100000;
bool v[40]={0};
void dfs(int k,int l,int s){
if (k==n){
int ll=l+d[s][0];
if (minn>ll)minn=ll;
return;
}
for (int i=1;i<n;i++){
int ii=a[s][i].i;
if (v[ii])continue;
int ll=a[s][i].l;
if (l+ll+zsum-z[s]>=minn)continue;
v[ii]=true; zsum-=z[s];
dfs(k+1,l+ll,ii);
v[ii]=false; zsum+=z[s];
}
return;
}
bool cmp(x a,x b){return a.l<b.l;}
int main(){
scanf("%d",&n);
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
scanf("%d",&d[i][j]);
a[i][j].i=j;
a[i][j].l=d[i][j];
}
std::sort(a[i],a[i]+n,cmp);
z[i]=a[i][1].l;
zsum+=z[i];
}
v[0]=true;
dfs(1,0,0);
printf("%d\n",minn);
return 0;
}