哈密顿路径

· 浏览次数 : 9

小编点评

这道题是一个典型的动态规划问题,可以使用动态规划的方法来解决。首先,我们需要定义一个二维数组`dp`来存储从起点到终点的所有可能路径的数量。其中,`dp[i][j][k]`表示从起点`i`到终点`j`,并且经过了`k`个点的路径数量。 接下来,我们可以按照以下步骤进行动态规划: 1. 初始化:对于所有的`i`和`j`,如果`i`和`j`相邻,则`dp[i][j][0] = 1`,否则`dp[i][j][0] = 0`。因为当`k=0`时,只有一种情况,即不经过任何点。 2. 对于任意的`i`,`j`和`k`(`k<=i+j-2`),我们有: - 如果`i`和`j`相邻,则`dp[i][j][k] = dp[i][j][k-1] + dp[i][邻居][k-1] + dp[邻居][j][k-1] - dp[i][邻居][j][k-1]`。这是因为我们要把`i`到`j`的路径分成两部分:一部分是从`i`到`邻居`,另一部分是从`邻居`到`j`,然后把这两部分的路径数量加起来,并减去同时经过`i`和`邻居`以及邻居和`j`的路径数量,以避免重复计算。 3. 最后,我们需要统计从起点到终点的所有可能路径的数量。这可以通过对所有`i`和`j`计算`dp[0][n-1][n^2-1]`来实现,其中`0`表示起点,`n-1`表示终点,`n^2-1`表示经过了`n^2`个点的状态。 这个算法的时间复杂度是`O(n^2 * 2^n)`,因为在转移过程中,我们需要计算大量的状态,而每个状态需要`O(2^n)$的空间来存储。因此,这个算法可能会TLE(Time Limit Exceeded)。 为了优化这个问题,我们可以尝试使用更高效的数据结构或算法来存储和计算状态。例如,我们可以使用位运算来存储状态,这样可以大大减少空间的需求。另外,我们也可以尝试使用更高效的动态规划算法,比如并行化或者分布式计算等。 至于鸽巢原理,它在这个问题中并没有直接的应用,因为我们并不是在寻找所有可能的路径,而是只需要找到至少一条可行的路径。因此,我们不需要使用鸽巢原理来限制算法的时间复杂度。 最后,关于代码实现,由于题目没有给出具体的代码要求,我们可以假设我们需要编写一个函数`has_path`,该函数接受起点`i`、终点`j`和经过的点数`k`作为输入,返回一个布尔值表示是否存在从起点`i`到终点`j`并且经过了`k`个点的路径。这个函数的实现将依赖于上面的动态规划算法。

正文

题目描述

有一张n个节点的无向图,对于所有 (i,j),判断 i 和 j 之间是否存在哈密顿路径

1<=n<=24

哈密顿路径:经过每个点恰好一次

乐乐乐乐乐

考虑暴力:\(dp[i][j][st]\)表示从\(i\)开始到\(j\)的经过的点的状态\(st\)(\(st\)状压每一个点是否被经过)是否可行

转移时枚举一个\(k\),类似Floyd,要求\(st\)的并只有\(k\)

复杂度:\(O(n^32^n)\),轻轻松松TLE(乐)

奇妙性质:对于任意一点\(k\),哈密顿路径中\(i\)\(j\)可以拆为\(k\)\(i\)\(k\)\(j\)(如果存在这条路径,那么一定经过每一个点)

我们钦定\(1\)\(k\)点,点对\((i,j)\)的路径相当于\((i,1)\)\((1,k)\)两条路径拼接得到

设计新dp:\(dp[i][st]\)表示从1出发到\(j\)状态为\(st\)(\(st\)意义同上)是否可行

转移枚举下一个点即可

我们优化掉了一维,且\(st\)的状态少一半(不用压第一个点)

复杂度:\(O(n2^n)\),依然爆炸

取不来小标题

发现dp仅存储可不可行,浪费了

我们再压dp:\(dp[st]\)状态为\(st\)(\(st\)意义同上的上),可以到的点的状压(dp状态、值虽然都是\(2^n\)状压,但意义不同)

这样就是\(O(n2^n)\)

考虑统计答案

我们要统计\(n^2\)个点对\((i,j)\)是否可行

鸽了

与哈密顿路径相似的内容:

哈密顿路径

题目描述 有一张n个节点的无向图,对于所有 (i,j),判断 i 和 j 之间是否存在哈密顿路径 1<=n<=24 哈密顿路径:经过每个点恰好一次 乐乐乐乐乐 考虑暴力:\(dp[i][j][st]\)表示从\(i\)开始到\(j\)的经过的点的状态\(st\)(\(st\)状压每一个点是否被经过)

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好,我是咸鱼 好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接:https://www.jd.com/ 完整源码在文章最后 ## 元素定位 我们需要找到网页上元素的位置信息(xpth 路径) ![image](

关于 Bash 脚本中 Shebang 的趣事

哈喽大家好,我是咸鱼 不知道小伙伴们在写 Bash 脚本或者说看别人的 Bash 脚本的时候有没有注意过脚本的第一行 #!/bin/bash Bash 脚本的第一行往往以 #! 开头,这一行称作 shebang 行 在 类 UNIX 系统中,shebang 行用来指定脚本的解释器路径,通常出现在第一

go高并发之路——go语言如何解决并发问题

一、选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但21年之后的新项目基本上就都

记一次 .NET某账本软件 非托管泄露分析

一:背景 1. 讲故事 中秋国庆长假结束,哈哈,在老家拍了很多的短视频,有兴趣的可以上B站观看:https://space.bilibili.com/409524162 ,今天继续给大家分享各种奇奇怪怪的.NET生产事故,希望能帮助大家在未来的编程之路上少踩坑。 话不多说,这篇看一个.NET程序集泄

K8S 中的 CRI、OCI、CRI shim、containerd

哈喽大家好,我是咸鱼。 好久没发文了,最近这段时间都在学 K8S。不知道大家是不是和咸鱼一样,刚开始学 K8S、Docker 的时候,往往被 CRI、OCI、CRI shim、containerd 这些名词搞得晕乎乎的,不清楚它们到底是干什么用的。所以今天,咸鱼打算借这篇文章来解释一下这些名词,帮助

Dotnet算法与数据结构:Hashset, List对比

哈希集A 是存储唯一元素的集合。它通过在内部使用哈希表来实现这一点,该哈希表为基本操作(如添加、删除和包含)提供恒定时间平均复杂度 (O(1))。此外,不允许重复元素,使其成为唯一性至关重要的场景的理想选择。另一方面,表示按顺序存储元素的动态数组。它允许重复元素并提供对元素的索引访问,使其适用于需要

面试官:Java线程可以无限创建吗?

哈喽,大家好,我是世杰。 ⏩本次给大家介绍一下操作系统线程和Java的线程以及二者的关联 1. 面试连环call Java线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区分内核态和用户态? ⏩要想解答这些问题,我们要先从操作系统线程开始说起,让我们开始吧�

哈啰面试:说说Dubbo运行原理?

Dubbo 是一款高性能、轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务架构。那 Dubbo 又是如何运行的呢?让我们一起来看。 1.核心组件 要说 Dubbo 运行流程就不得不先来了解一下 Dubbo 的核心组件了,因为 Dubbo 的交互流程是和核心组件息息相关的。 D

前端:异地登录!!!

哈喽,大家好 !今天来聊一聊前端怎么实现异地登录提示!!! 在数字化时代,账户安全是每个用户和开发者都不容忽视的问题。 异地登录提示是一种安全措施,用于提醒用户他们的账户可能在不同的位置被访问。 这通常涉及到检测登录行为的异常,比如IP地址的变化,并在检测到异常时通知用户。 用户登录记录的重要性 首