给定n个点的带权路径,求0到n-1的最短哈密顿通路,使用位运算以及动态规划的思想进行精确计算,实际上算法能处理的结点数量大约在20个,如果只需要获得
比较优的解可以通过神经网络、模拟退火等最优化理论的算法进行搜索。
代码如下:
#include<iostream> #include<string.h> //5 //0 2 4 5 1 //2 0 6 5 3 //4 6 0 8 3 //5 5 8 0 5 //1 3 3 5 0 using namespace std; int f[1<<20][20];//一维压缩存储经过的点,二维标志最后一个经过的点 int weight[20][20],n; int hamiton(int n,int weight[20][20]){ memset(f,0x3f,sizeof(f));//为weight的每一个字节赋值,相当于设置了inf f[1][0]=0;//首先是在起点0,最终访问是0 for(int i=1;i<1<<n;i++) for(int j=0;j<n;j++)if((i>>j) & 1)//如果经过了点j for(int k=0;k<n;k++)if((i^1<<j)>>k & 1)//如果没经过j的状态中经过了k,从经过的结点中进行扩展 f[i][j]=min(f[i][j],f[i^(1<<j)][k]+weight[k][j]); return f[(1<<n)-1][n-1];//最终是经过n个点并且终点时n-1 } int main(){ cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ scanf("%d",&weight[i][j]); } cout<<hamiton(n,weight)<<endl; }