旅行者

新方法get

法一:我们考虑最终的答案,一定是从某一个关键点 A 走到另一个关键点 B,那我们要找一种最短路径,保证中途经过两个关键点,而且能够覆盖所有的关键点对。所以我们考虑把其中一部分关键点作为起始点的下一个点,剩下的关键点作为终点的上一个点,于是我们建立两个虚点st,从s出发向第一部分关键点连有向边,从第二部分关键点向t连有向边,这样从st的最短路就包含了AB两部分的所有集合点对。然后我们利用事实,若ij,则两者的二进制位一定有一位不同,通过枚举二进制位遍历分组就好了

法二:我们枚举每一条边(u,v,w),如果我们假设某个关键点p是所有关键点里面到u最近的一个关键点,qv到所有关键点中最近的一个关键点,那么显然p->u->v->q就是一种可能的候选答案。我们枚举所有的边,显然就不会漏掉答案,现在的关键问题是怎么求出pq

这就要用到dij的一种骚操作了,先求p。我们把所有关键点的dis初始化为0,其余的dis都为正无穷,然后把所有关键点先一次性加入优先队列里面,然后跑dij就可以了。再求q,这个时候我们在反图上面跑类似的过程就好了

多起点dij一般可以用来解决下面的问题:一个图上有若干关键点,求每个点到任意一个关键点的最短距离

当然法二的枚举边的操作也要记住,求次短路的一种方法也利用了这个思路。属于转换对象法的范畴,相当于我们原来考虑的是点,现在考虑的是边。我们也讲过枚举中转点的操作,即“最优贸易”这道题目,这里相当于枚举中转边(这里枚举中转点在最优路径是直接从一个关键点到另一个关键点的时候会出错)

update 2024.5.21

重新做这道题目,我居然想到了法一加法二。。。

这道题目的考点其实就是多起点的dij(多起点的dij也在有向图求最小环中运用到了,复杂度是一样的不会退化)

有了多起点dij,就可以很容易的想到分组了

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示