1 #include <iostream>
2 #include <cstdio>
3 #include <memory.h>
4 using namespace std;
5 const int INF=0x3f3f3f3f,city=4;
6 int main(){
7 int a[city][city],dp[city][1<<city];
8 memset(dp,INF,sizeof(dp));
9 for(int i=0;i<city;i++){
10 for(int j=0;j<city;j++){
11 scanf("%d",&a[i][j]);
12 }
13 }
14 for(int i=0;i<city;i++)//初始化第一列
15 dp[i][0]=a[i][0];
16 for(int j=1;j<(1<<(city-1));j++){//111 j<2^3 初始化剩余列
17 for(int i=0;i<city;i++){
18 if(((j>>i-1)&1)==0){// i不在集合里面 关于位运算移动负数位,求出负数的补码,取低六位,进行移动。
19 for(int k=1;k<city;k++){
20 if(((j>>k-1)&1)==1){//对于集合里每一个元素开始min
21 dp[i][j]=min(dp[i][j],a[i][k]+dp[k][j^(1<<k-1)]);
22 }
23 }
24 }
25 }
26 }
27 for(int i=0;i<city;i++){
28 for(int j=0;j<(1<<city-1);j++){
29 if(dp[i][j]!=INF)
30 cout<<dp[i][j]<<" ";
31 else
32 cout<<"-1 ";
33 }
34 cout<<endl;
35 }
36 printf("最短路径是:");
37 if(dp[0][(1<<city-1)-1]!=INF)
38 cout<<dp[0][(1<<city-1)-1]<<endl;
39 else
40 cout<<"-1"<<endl;
41 }