最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目

题目描述

给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。

输入

第一行一个整数n。
接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(一个不超过10^7的正整数,记为a[i,j])。
对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。

输出

一个整数,表示最短Hamilton路径的长度。

样例数据

4
0 2 1 3
2 0 2 1
1 2 0 1
3 1 1 0

思路讲解

作为一道最基础的状压dp ,我们需要掌握它为什么是这么做的。

我作为一名菜鸡,首先想到的就是朴素做法,可是朴素做法它的时间复杂度不允许我通过这道题目。

那我们分析一下朴素做法,从起点到终点每个点只经过一次且求最短路径,,,嗯,最暴力的话就是我们应该把所有的不同种路径全都枚举出来(这个当然就是全排列啦),然后去比较寻找最短路径。

那么这个复杂度是O(n*n !),因为我们枚举所有情况是O(n!),然后每一种路径求和是O(n)的,所以总复杂度是O(n*n!),这个不难分析。

但是我们想了,这么大的复杂度该怎么办呢?  我们再来想想 ,我们的复杂度之所以大是因为  “  n!  ” ,所以我们试图从这里想想办法。

枚举每一位,所有种方案,,,我们可以用二进制,因为二进制同样可以把一组数表示出来,,所以我们想到了用状压去做。

我们定义f(i,j) i 表示的是当前的二进制数  , j 表示的是当前所到达的二进制的第j位

在任意时刻,我们还需要知道当前所处的位置,因此我们用f(i ,j )表示“点被经过的状态” 对应的二进制数位i 且目前处于j时的最短路径。

在任意时刻,有公式f【i,j】=min(i xor (1<<j)  ,    k )+a(k,j)     a数组表示从k到j的路径大小。

i xor  (1<<j ) 表示的是在上一时刻我们所处位置是的路径和

所以公式的意思就明白了  ,就是上一个时刻的路径和与当前时刻的路径和大小的比较

代码实现

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n ;
int a[25][25]; // 代表i到j路径花费
int f[1<<22][25]; //利用二进制的思想 , i表示的是当前的二进制数, j表示的是当前所到达的二进制的第j位
int main(){
scanf("%d",&n);
for(int i=0 ;i<n;i++){
for(int j=0 ;j<n;j++){
scanf("%d",&a[i][j]);
}
} memset(f,127,sizeof(f));
f[1][0] = 0 ;
for(int i=1 ;i<(1<<n);i++){
for(int j=0 ; j<n ;j++){
if((i>>j)&1){ //表示的是我们枚举二进制数的时候 ,这个数中第j位是不是已经被选中了,如果没选过,那我们还用它干嘛。最后的结果不就是n-1个数全部选中嘛
for(int k=0 ;k<n ;k++ ){
if((i>>k)&1){
f[i][j] = min(f[i][j], f[i^(1<<j)][k]+a[k][j]) ;
}
}
}
}
}
cout << f[(1<<n)-1][n-1]<<endl;
return 0 ;
}

最短Hamilton路径(状压dp)的更多相关文章

  1. 完全图的最短Hamilton路径——状压dp

    题意:给出一张含有n(n<20)个点的完全图,求从0号节点到第n-1号节点的最短Hamilton路径.Hamilton路径是指不重不漏地经过每一个点的路径. 算法进阶上的一道状压例题,复杂度为O ...

  2. 最短Hamilton路径-状压dp解法

    最短Hamilton路径 时间限制: 2 Sec  内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamil ...

  3. Acwing-91-最短Hamilton路径(状压DP)

    链接: https://www.acwing.com/problem/content/93/ 题意: 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hami ...

  4. 『最短Hamilton路径 状态压缩DP』

    状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...

  5. CH0103最短Hamilton路径 & poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

  6. 最短Hamilton路径【状压DP】

    给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...

  7. 0103 最短Hamilton路径【状压DP】

    0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...

  8. AcWing 最短Hamilton距离 (状压DP)

    题目描述 给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径. Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰 ...

  9. 【状压dp】Hamiton路径

    描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点 ...

随机推荐

  1. 关于.NET中的控制反转(一)- 概念与定义

    一.控制反转 1:类与类的依赖 依赖是面向对象中用来描述类与类之间一种关系的概念.两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务,这样的两个对象之间主要体现为依赖关系 ...

  2. Goland 设置代码格式化

    前言 之前一直喜欢 VsCode 的代码自动格式化和其他的一些功能 今天了解到原来 Goland 也有这些功能, 想想也对, 毕竟这么大 正文 Goland设置代码格式化 进入设置,按需选择要使用的, ...

  3. Python requirements.txt 语法

    前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...

  4. Linux SSH , SCP 建立信任关系(免密传输)

    最近有个需求,Jenkins需要将war传输到各个项目节点中,所以需要远程执行各个节点的shell脚本.但是中间有个输入密码的过程,在自动化部署中是行不通的,故需要增加免密登录.具体如下: 如果想在  ...

  5. 使用Python自动填写问卷星(pyppeteer反爬虫版)

    写此文的目的是为了方便寒假自己忘记填问卷星 一开始的想法和去年一样,去年就写过一版,想着今年不过就是改改数据,换换id而已,另外没想到的事情发生了... 满怀信心的写完代码 from selenium ...

  6. 无限重置IDE过期时间插件 亲测可以使用

    相信破解过IDEA的小伙伴,都知道jetbrains-agent这个工具,没错,就是那个直接拖入到开发工具界面,一键搞定,so easy的破解工具!这个工具目前已经停止更新了,尽管还有很多小伙伴在使用 ...

  7. 一道有趣的golang排错题

    很久没写博客了,不得不说go语言爱好者周刊是个宝贝,本来想随便看看打发时间的,没想到一下子给了我久违的灵感. go语言爱好者周刊78期出了一道非常有意思的题目. 我们来看看题目.先给出如下的代码: p ...

  8. MySQL where 条件字句查询

    where 条件字句 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两 ...

  9. yum -y install gnuplot

    [root@test~]# yum -y install gnuplotLoaded plugins: fastestmirrorLoading mirror speeds from cached h ...

  10. 【Jboss】A RESOURCE POOL IS PERMANENTLY BROKEN!

    jboss后台报错,其中有这个错误 [error] A RESOURCE POOL IS PERMANENTLY BROKEN! 查阅多方资料后发现.数据库连接配置文件中,有地方存在空格,导致服务连接 ...