1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INF 1e7 5 int a[20][20],num,n,sum,cot,b[20][1<<17]; 6 bool flag[20]; 7 8 int minn(int x,int y) 9 { 10 return x<y?x:y; 11 } 12 13 void dfs(int x,int y,int z) 14 { 15 if(y==n&&cot==n) 16 { 17 num=minn(num,sum); 18 return ; 19 } 20 if(sum>=num) 21 return ; 22 if(sum<b[y][z]||b[y][z]==0) 23 b[y][z]=sum; 24 else 25 return; 26 for(int j=2;j<=n;j++) 27 { 28 if(!flag[j]) 29 { 30 sum+=a[y][j]; 31 flag[j]=1; 32 cot++; 33 dfs(y,j,z+(1<<j)); 34 flag[j]=0; 35 cot--; 36 sum-=a[y][j]; 37 } 38 } 39 } 40 41 int main() 42 { 43 scanf("%d",&n ); 44 for(int i=1;i<=n;i++) 45 { 46 for(int j=1;j<=n;j++) 47 { 48 scanf("%d",&a[i][j] ); 49 } 50 } 51 52 num=INF; 53 sum=0; 54 cot=1; 55 memset(flag,0,sizeof(flag)); 56 memset(b,0,sizeof(b)); 57 flag[1]=1; 58 dfs(1,1,1); 59 printf("%d\n",num); 60 return 0; 61 }
只有不断学习才能进步!