如上图所示,我们不妨设 u \to v 的路径上必须经过 x(x < u),那么 x 和 u 一定相互可达,x 会在统计 v 的答案之前被删掉。
于是我们可以发现,若定义两点 (u, v) 有贡献当且仅当 u > v 且 u 和 v 之间可以通过大于 v 的点相互到达,则 h(G) 就是在求解 G 中所有点对的贡献之和。
我们考虑 \rm Floyd 算法的过程,实际上就是在不断求解如果只经过当前已经枚举的这些中转点 k,有哪些 u 可以走到 v. 于是求解 h(G) 只需要从大到小枚举中转点 k,并在 \rm Floyd 的过程中记录下当前 v = k - 1 的答案即可。
进一步观察发现,如果我们按照编号从大到小将边加入图 G,那么必然可以找到一个分界点,使得 u 和 v 恰好变为有贡献的点对。容易发现,这个分界点就是 u 和 v 可以相互到达的路径上编号最小的边的最大值。求解这个最大值是简单的,只需要将初始矩阵修改成边的编号,方程改写为 f_{u, v} = \max\{f_{u, v}, \min\{f_{u, k}, f_{k, v}\}\} 即可。