完全图的最短Hamilton路径——状压dp
题意:给出一张含有n(n<20)个点的完全图,求从0号节点到第n-1号节点的最短Hamilton路径。Hamilton路径是指不重不漏地经过每一个点的路径。
算法进阶上的一道状压例题,复杂度为O(n^2 * 2^n),还是蛮恐怖的。
设f[i][j]表示当前经过状态为i,且当前在点j所花费的最小代价。其中i是二进制压缩值,从0~n-1位分别表示这个点是否经过了。目标状态为f[2^n - 1][n - 1],那么我们从小到大枚举i,再循环枚举当前点j和上一个状态所在的点k即可。
转移方程:f[i, j] = min(f[i xor 2^j, k] + edge_weight[k, j])。其中i xor 2^j可以从i表示的状态中去掉第j位。需要注意的是,枚举j、k的时候要特判选择它是否符合当前状态。
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- int f[1 << 20][20], w[20][20], n;
- int hamiton() {
- memset(f, 0x3f, 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)
- for (int k = 0; k < n; ++k) if ((i xor 1 << j) >> k & 1)
- f[i][j] = min(f[i][j], f[i xor 1 << j][k] + w[k][j]);
- return f[(1 << n) - 1][n - 1];
- }
- int main() {
- cin >> n;
- int t;
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < n; ++j) {
- cin >> t;
- w[i][j] = t;
- }
- cout << hamiton();
- return 0;
- }
完全图的最短Hamilton路径——状压dp的更多相关文章
- 最短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)
最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 ...
- 最短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 不重不漏地经过每个点 ...
随机推荐
- Mybatis---04Mybatis配置文件浅析(二)
本文参考:https://www.cnblogs.com/yulinfeng/p/5991170.html 1.typeHandlers:类型处理器,设置预处理语句(PreparedStatement ...
- 谈谈Android项目框架的前世今生
嗨,大家好,今天出了大太阳,真是美好的开始. 这篇文章和大家说说Android届流行的三大框架,了解下架构的前世今生,以及我对于这些框架的一些认识和看法. 三大框架区别 MVC 架构介绍 Model: ...
- Redis缓存雪崩和穿透的解决方法
转载自: https://blog.csdn.net/qq_35433716/article/details/86375506 如何解决缓存雪崩?如何解决缓存穿透?如何保证缓存与数据库双写时一致的问题 ...
- 16 String类
java中的所有的字符串文字(例如"abc","123")都可以看做是实现了此类的实例对象 eg: String str = new String(); str ...
- Spring源码知识概览
目录 Spring知识总览 1.1 IOC 1.2 Spring中重要接口概览 Spring知识总览 1.1 IOC IOC是控制反转,是一种思想 DI是依赖注入,是控制翻转的一种实现 Spring的 ...
- Python ( 高级 第二部)
目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...
- 模块导入from collections import Iterator,Iterable失败
1.引入模块报错 from collections import Iterator,Iterable 报错: DeprecationWarning: Using or importing the AB ...
- P1098 字符串的展开
P1098 字符串的展开 刷新三观的模拟题 题意描述 太长了自己去看吧. 算法分析 模拟题分析你*呀! 写这篇题解的唯一原因是:三目运算符用的好的话,可以让百行大模拟变成30行水题. 代码实现 #in ...
- 抓紧下载了!2020最新版《神经网络与深度学习》中文版,PDF免费开放下载
介绍<神经⽹络和深度学习>是⼀本免费的在线书,对读者数学知识需求适度,兼顾理论和动手实践.⽬前给出了在图像识别.语⾳识别和⾃然语⾔处理领域中很多问题的最好解决⽅案,教读者在神经⽹络和深度学 ...
- Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法
一.报错含义: val=9 def test(): print(val) val = 6 print(val) test() 翻译:本地变量xxx引用前没有定义. 二.报错原因 这是Python变量作 ...