题解:[省选联考2021] 图函数

2024-09-13

CLICK HERE(LINK)

$\large\text{Outline}$

  • 众所周知,不加 bitset 优化的 $\text{Floyd}$ 通过 $n=10^3$ 的数据也很轻松。

$\large\text{Algorithm}$

计算 $h(G_0)=\sum_{u\in V} f(u,G_0)$:

  • 首先,在原图上找到仍存在于当前导出子图的路径,考虑点的存在性显然更优。生成子图反之。
  • 遵循该原则,设 $P$ 为 $u\rightarrow v(u>v)$ 某一路径上点的集合,在计算点对 $(u,v)$ 贡献时,$P$ 存在当且仅当 $\forall w\geq\min(u,v) \mid w\in P$。
  • 存在满足要求的 $P$ 时,$(u,v)$ 会产生 $1$ 的贡献。由于 $P$ 的约束关涉到中转点可达性,容易想到使用倒序枚举中转点的 $\text{Floyd}$ 实现。

计算 $\sum_{i=0}^{m}h(G_i)$:

  • 考虑单个点对 $(u,v)$,很容易发现,存在时刻 $k\in[0,m+1]$,使得它们在 $[0,k)$ 时刻可达,在 $[k,m]$ 时刻不可达。
  • 因此可以在 $\text{Floyd}$ 的过程中计算出 $(u,v)$ 变得相互不可达的时刻。
  • 可以令邻接矩阵元素 $g[u][v]$ 表示 $u\rightarrow v$ 路径上最早删去的边被删除的时刻。在 $\text{Floyd}$ 中进行转移,得到最大值,即 $g[u][v] = \max(g[u][v], \min(g[u][k],g[k][v]))$。

$\large\text{Notes}$

  • 在 $\text{Floyd}$ 这种小常数的算法中,使用三目运算代替标准库的 min/max 函数会有显著的常数优化。