AcWing.91,最短Hamilton路径(状态压缩dp)

2024-01-28 01:44

本文主要是介绍AcWing.91,最短Hamilton路径(状态压缩dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给定一张 n n n 个点的带权无向图,点从 0∼ n n n−1 标号,求起点 0 到终点 n n n−1 的最短 Hamilton 路径。

Hamilton 路径的定义是从 0 到 n n n−1 不重不漏地经过每个点恰好一次。

输入格式
第一行输入整数 n n n

接下来 行每行 n n n 个整数,其中第 i i i 行第 j j j 个整数表示点 i i i j j j 的距离(记为 a [ i , j ] a[i,j] a[i,j])。

对于任意的 x x x, y y y, z z z,数据保证 a [ x , x ] a[x,x] a[x,x]=0, a [ x , y ] = a [ y , x ] a[x,y]=a[y,x] a[x,y]=a[y,x] 并且 a [ x , y ] + a [ y , z ] ≥ a [ x , z ] a[x,y]+a[y,z]≥a[x,z] a[x,y]+a[y,z]a[x,z]

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

数据范围
1 ≤ n n n ≤ 20
0 ≤ a [ i , j ] a[i,j] a[i,j] ≤ 107

输入样例:

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

输出样例:

18

使用 f [ i ] [ j ] f[i][j] f[i][j]表示:从 0 0 0走到 j j j点,中间经过的点是 i i i(走过的点存到 i i i里)的所有路径中的最小路径

其中 i i i的每一位表示每一个点有没有走过, 1 1 1表示走过, 0 0 0表示没走过,如:当 i i i= 1011 1011 1011时,我们就走过了第 0 0 0个点,第 1 1 1个点,第 3 3 3个点。(从右向左看)

如何划分情况:以倒数第二个点来分类
如果倒数第二个点为0,1,2…, n n n-1,那么当经过 k k k走到 j j j点时,状态将由 f [ i − j , k ] + a [ k , j ] f[i-j,k] + a[k,j] f[ij,k]+a[k,j]转移过来

代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 20, M = 1 << N;int n;
int a[N][N];
int f[M][N];int main() {cin >> n;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)cin >> a[i][j];memset(f, 0x3f, sizeof f);f[1][0] = 0;	//在第0个点时为0,初始化dp数组for (int i = 0; i < 1 << n; i++)	//枚举所有状态for (int j = 0; j < n; j++)if (i >> j & 1)		//当从0走到j时,i也一定满足在j这个点位上的数为1(包含j)for (int k = 0; k < n; k++)	//枚举从哪个点转移过来if ((i - (1 << j)) >> k & 1)	//i除去j之后,一定要满足i在k这个点位上的数为1f[i][j] = min(f[i][j], f[i - (1 << j)][k] + a[k][j]);	//状态转移cout << f[(1 << n) - 1][n - 1] << endl;	//走到n-1时的最短路径return 0;
}

这篇关于AcWing.91,最短Hamilton路径(状态压缩dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652105

相关文章

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使