加载中...

cf div1 706 D (判断两点间最短路径是否唯一、最短路径树方案数)

D. BFS Trees

训练赛遇到的压轴题,个人认为能从这道题里学到东西。

首先我们需要知道:对于一棵 可以同时将两个不同的点作为根 的最短路树(设这两个点为 \(u,v\)),当且仅当 \(u,v\) 之间的最短路只有唯一一条。

否则,若存在多条不同的最短路,由于最短路树的性质,这些最短路都必须存在于最短路树中。那么 \(u,v\) 的任意两条最短路径就会在最短路树上形成环,导致无法形成生成树。

那么,如何判断 \(u,v\) 之间的最短路径是唯一的?

  • 对于无权图,设 \(dist_{u,v}\)\(u,v\) 之间的最短路,那么充要条件为:满足 \(dist_{u,k} + dist_{k,v} = dist_{u,v}\)\(k\) 的数量恰好为 \(dist_{u,v} + 1\)
  • 对于有权图,也是类似:满足 \(dist_{u,k} + dist_{k,v} = dist_{u,v}\)\(k\) 的数量恰好为最短路径上的点数,对于最短路径上的点数这个信息可以按照无权图的方式额外维护。

考虑分别计算每个 \(f(i, j)\)。由上述,存在同时以 \(i,j\) 为根的最短路树的充要条件为:\(i, j\) 之间的最短路径唯一。判断合法后,考虑进一步将其他不在该最短路径上的点加入到生成树中,计算方案数。

对于计算最短路径树的方案数:可以分别计算每个点的合法父亲方案数,然后作乘法原理,即为总方案数。

对于点 \(u\),点 \(v\) 可以在最短路径树中作为 \(u\) 的父亲的条件:

\[dist_{root,v} + w(v, u) = dist_{root,u} \]

而最短路径树中同时有两个根时,只需要对于这两个根同时满足条件就可以了。

于是,我们只需要对于每个点 \(u\),枚举它的所有邻结点,检验其是否可以作为 \(u\) 在最短路径树中的父亲就可以了。但是需要注意,对于已经在最短路径上的点不需要重复统计,因为它们的父亲已经钦定好了。

复杂度 \(O(n^{2}(n+m))\)

code

posted @ 2026-04-05 15:49  小橘奏  阅读(20)  评论(0)    收藏  举报