CF round 623 Div.1D Tourism 题解
大意:
个顶点的有向图,顶点编号为 到 ,任意两个不同的顶点 ,都有一条带权有向边 。
Masha 想从 出发走 条边之后返回 ,且不走长度为奇数的环。(某一时刻 Masha 在 ,之后走了经过奇数条路径后回到 ,这是不允许的)
问 Masha 走过的路径权值之和的最小值。
(,,边权 ,保证 k 是偶数)
(不要看位置是 D,这题是除了签到题外最简单的题 qwq 但我还是没做出来)
我首先想到的是广义矩阵乘法,即把矩阵乘法中的乘法换成加法,加法换成最小值(即 ),这样邻接矩阵的 次方取 就是(伪)答案。 但是这个答案是允许奇环的,所以比赛时我接下来就不知道在干嘛了。
第一种思路是先染色,把点分成两部分,不允许走偶数次到达的点(黑点)和不允许走奇数次到达的点(白点),连接黑黑或白白的边权都设成 inf,这样构造的新的矩阵再 次方就行了。当时我一算,要至少算 次矩阵快速幂,每个矩阵快速幂复杂度 ,感觉十分绝望。
这个思路的正解其实是把所有点随机染色成黑白,每跑一遍矩快更新一下答案。事实上染色正确的概率是 ,跑个几千次完全没问题(果然我还没领悟随机化的精髓)。
第二种思路是确定走偶数次到达的点(假设已染黑),这样所有走奇数次到达的点可以随心所欲不逾矩(只要不是黑点就行了),它们两两互不干涉,所以在确定黑点的基础上 for 一下就行了。这样复杂度是 ,不够优化,哭唧唧。
这个思路的正解是事先处理一下所有的 的权值和存到数组 f[A][B] 中,然后排个序。如果要找 经过某一点到 的最短路(这个“某一点”不能是黑点),就从 f[A][B] 中找第一个不是黑点的路径。黑点最多也就 5 个,比找 80 次强多了。
(代码?代码是不存在的,作者太懒了)