旅行商问题(Tsp)动态规划

参考: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_40823740/article/details/109649975