最短Hamilton路径(状压dp)
最短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)的更多相关文章
- 完全图的最短Hamilton路径——状压dp
题意:给出一张含有n(n<20)个点的完全图,求从0号节点到第n-1号节点的最短Hamilton路径.Hamilton路径是指不重不漏地经过每一个点的路径. 算法进阶上的一道状压例题,复杂度为O ...
- 最短Hamilton路径-状压dp解法
最短Hamilton路径 时间限制: 2 Sec 内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamil ...
- Acwing-91-最短Hamilton路径(状压DP)
链接: https://www.acwing.com/problem/content/93/ 题意: 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hami ...
- 『最短Hamilton路径 状态压缩DP』
状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...
- CH0103最短Hamilton路径 & poj2288 Islands and Brigdes【状压DP】
虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位 \((n >> ...
- 最短Hamilton路径【状压DP】
给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...
- 0103 最短Hamilton路径【状压DP】
0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...
- AcWing 最短Hamilton距离 (状压DP)
题目描述 给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径. Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰 ...
- 【状压dp】Hamiton路径
描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点 ...
随机推荐
- 关于.NET中的控制反转(一)- 概念与定义
一.控制反转 1:类与类的依赖 依赖是面向对象中用来描述类与类之间一种关系的概念.两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务,这样的两个对象之间主要体现为依赖关系 ...
- Goland 设置代码格式化
前言 之前一直喜欢 VsCode 的代码自动格式化和其他的一些功能 今天了解到原来 Goland 也有这些功能, 想想也对, 毕竟这么大 正文 Goland设置代码格式化 进入设置,按需选择要使用的, ...
- Python requirements.txt 语法
前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...
- Linux SSH , SCP 建立信任关系(免密传输)
最近有个需求,Jenkins需要将war传输到各个项目节点中,所以需要远程执行各个节点的shell脚本.但是中间有个输入密码的过程,在自动化部署中是行不通的,故需要增加免密登录.具体如下: 如果想在 ...
- 使用Python自动填写问卷星(pyppeteer反爬虫版)
写此文的目的是为了方便寒假自己忘记填问卷星 一开始的想法和去年一样,去年就写过一版,想着今年不过就是改改数据,换换id而已,另外没想到的事情发生了... 满怀信心的写完代码 from selenium ...
- 无限重置IDE过期时间插件 亲测可以使用
相信破解过IDEA的小伙伴,都知道jetbrains-agent这个工具,没错,就是那个直接拖入到开发工具界面,一键搞定,so easy的破解工具!这个工具目前已经停止更新了,尽管还有很多小伙伴在使用 ...
- 一道有趣的golang排错题
很久没写博客了,不得不说go语言爱好者周刊是个宝贝,本来想随便看看打发时间的,没想到一下子给了我久违的灵感. go语言爱好者周刊78期出了一道非常有意思的题目. 我们来看看题目.先给出如下的代码: p ...
- MySQL where 条件字句查询
where 条件字句 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两 ...
- yum -y install gnuplot
[root@test~]# yum -y install gnuplotLoaded plugins: fastestmirrorLoading mirror speeds from cached h ...
- 【Jboss】A RESOURCE POOL IS PERMANENTLY BROKEN!
jboss后台报错,其中有这个错误 [error] A RESOURCE POOL IS PERMANENTLY BROKEN! 查阅多方资料后发现.数据库连接配置文件中,有地方存在空格,导致服务连接 ...