• 《算法竞赛进阶指南》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;
    }
  • 相关阅读:
    Models(Pascal)
    Summer Plan(挖坑待填)
    C++之指针
    QuickPower快速幂
    codevs 1231最优布线问题
    颓废了1年+,今天开始勤(tui)奋(fei)啦
    l'Hopital法则
    相律
    小意外
    一种改进的动力学处理方法
  • 原文地址:https://www.cnblogs.com/randy-lo/p/13122237.html
Copyright © 2020-2023  润新知