参考:TSP问题,动态规划法
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int n,m;
vector<vector<int>>dp;
#define INF 10e7
#define N 5
int g[N][N] ={
{0,3,INF,8,9},
{3,0,3,10,5},
{INF,3,0,4,3},
{8,10,4,0,20},
{9,5,3,20,0}
};
int tsp()
{
for (int i = 0; i < n; i++)
dp[i][0] = g[i][0];
for (int j = 1; j < m; j++)
{
for (int i =0; i < n; i++)
if (j & (1 <<(i - 1)) == 1)
continue;
else
{
for (int k = 1; k < n; k++)
{
if (j& (1 <<(k - 1))==0)//判断k是否在集合j中
continue;
else
{
/*int tmp = j ^ (1 <<(k - 1));
cout << tmp << endl;*/
dp[i][j] = min(dp[i][j], g[i][k] + dp[k][j ^ (1 << (k - 1))]);//j^(1<<(k-1))表示将k从j集合中抹去
}
}
}
}
return dp[0][m - 1];
}
void visit()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << setw(5)<<dp[i][j];
}
cout << endl;
}
}
int main()
{
n = 5;
m = pow(2, n - 1);
/*cout << m << endl;*/
dp = vector<vector<int>>(n, vector<int>(m, INF));
cout << "最短费用:" << tsp() << endl;
visit();
return 0;
}