《算法竞赛进阶指南》0x00 Hamiton路径 位运算

给定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;
}
原文地址:https://www.cnblogs.com/randy-lo/p/13122237.html