动态规划-tsp

 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 }
View Code

原文地址:https://www.cnblogs.com/hcl6/p/13974465.html