旅行者

新方法get

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

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

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

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

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

update 2024.5.21

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

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

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

posted @ 2024-03-17 12:12  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报