哈密顿回路

Posted morrowwind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈密顿回路相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
//状态压缩dp,二进制法,搜索法的优化
int dp[1<<20][21],n;//最多20个点,就是20位二进制
//在状态是i,末位点是j的情况下的最小值(因为状态没有顺序信息,但是其实只需要知道末尾点即可)
//通过上个状态推出下个状态,
int a[22][22];
int main() {
    while(cin>>n){
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>a[i][j];
            }
        }
        memset(dp,0x3f, sizeof(dp));
        dp[1][0]=0;//预处理第一个点
        for(int i=3;i<(1<<n);i++){
            //状态
            for(int j=0;j<n;j++){
                //末尾点
                if((i>>j)&1){
                    //保证状态里有这个点
                    //上一个状态肯定是01序列去掉j的位置的,因为这次才走j,那么上个状态是固定的
                    //但是上个状态的末尾点不确定,枚举他
                    for(int k=0;k<n;k++){
//if(((i>>k)&1) && k!=i)不可,因为他无法初始化 10000,的只有一个1的情况,其实也可,因为1000只有第一个点有效其他都无意义,而第一个点初始化了。。
                        if(((i>>k)&1) && k!=i){
                            dp[i][j]=min(dp[i][j],dp[(1<<j)^i][k]+a[k][j]);//去掉j对应的1,因为肯定是1,可以异或清0
                        }
                    }
                }
            }
        }
        cout<<dp[(1<<n)-1][n-1]<<endl;
    }
    return 0;
}

 

以上是关于哈密顿回路的主要内容,如果未能解决你的问题,请参考以下文章

哈密顿回路算法详解

【离散数学】图论(四)哈密顿回路(Hamiltonian cycle)

小专题哈密顿回路

POJ 2438 哈密顿回路

离散数学-图论-哈密顿图及其应用

哈密顿回路