经典TF问题
#include<bits/stdc++.h> using namespace std; int main(){ int n; while(cin>>n){ vector<vector<int>> dist(n,vector<int>(n,0));//图建立 int x; for(int i =0; i< n;i++){ for(int j =0; j< n;j++){ cin>>x; dist[i][j] = x; } } //dp旅行商问题 vector<vector<int>> dp(n,vector<int>(1<<(n-1),0));// n-1是为了只需要除了第一个点的其他点的位 dp[0][0] = 0; int v = 1<<(n-1); for(int j = 0; j< v ;j++){ for(int i =0; i< n;i++){ if(j==0){ dp[i][j]= dist[i][j];//表示从第i个城市到第j(0)个城市的最小路径。正好就是第i个城市去第0个城市的距离。 }else{ dp[i][j] = INT_MAX; for(int k = 1; k < n; k++){ //表示第k位城市。 int index = 1<<(k-1); //开始动归主要的表达式,首先我们要剪枝确保这个城市是可供访问的备选点 if((index&j)>0){ //表示j城市集内除了第k位其他的别的城市 int other = j ^ index; dp[i][j] = min(dist[i][k] + dp[k][other] ,dp[i][j]); } } } } } cout<<dp[0][v-1]<<endl;//最后返回 dp[0][{1,2,3}] = dp[0][v-1] } }