91. 最短Hamilton路径

算法:动态规划位操作压缩 题解:e[i][j] i表示路线 ,j表示终点 ,初始化e[1][0]=0,表示从0点出发。 例如:i=7,n=4,二进制为 0111 表示经过 点 0 1 2 。

 

 

点击查看代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int> pll;
typedef long long ll;
const int N=1e5+7;
int e[1<<20][20];
int a[21][21];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		cin>>a[i][j];
	}
	memset(e,0x3f,sizeof(e));
	e[1][0]=0;
	for(int i=0;i<1<<n;i++)//从小到大保证每一步都是最优解。
	{
		for(int j=0;j<n;j++)
		{
			if(i>>j&1)//确定从0点开始,结尾为j点
			for(int k=0;k<n;k++)
			if(i>>k&1)//中间线路包括 k点
			e[i][j]=min(e[i][j],e[i-(1<<j)][k]+a[k][j]);//k点为倒数第二个点。
		}
	}
	cout<<e[(1<<n)-1][n-1];
	return 0;
 } 
posted @ 2023-02-16 16:56  xxj112  阅读(11)  评论(0)    收藏  举报