1. YAML 元数据 已设置 tags: [KACTL, 图论, 核心概念]。

  2. 核心概述 在小规模图上以三重循环 O(N^3) 计算任意两点最短路,允许负权并将所有经过负环可达的点对距离标记为 -inf。

  3. 原文引述

Description: Calculates all-pairs shortest path in a directed graph that might have negative edge weights. Time: O(N^3)

  1. 展开阐述
  • 定义与背景

    • 目标:给定有向图的距离矩阵 m,返回所有点对 (i,j) 的最短距离;若 i→j 不可达则为 inf;若存在路径经过负权环使距离可无界减小,则记为 -inf。
    • 典型场景:需要全源最短路或频繁多对查询的小图;作为传递闭包/负环检测与传播的基础模块。
  • 接口/数据结构(据实现约定)

    • 输入:m 为距离矩阵(m[i][j]=inf 表示无边);常取 inf=1LL<<62。
    • 初始化:对角线 m[i][i] = min(m[i][i], 0),允许自环负边覆盖更小值。
    • 输出:就地更新 m,完成最短路、不可达与负环域(-inf)的统一语义。
  • 核心流程/要点(k 作为“中间点”的动态规划)

    1. 三重循环松弛
      • for k in [0..n): for i,j: 若 m[i][k]、m[k][j] 有限,则 m[i][j] = min(m[i][j], m[i][k] + m[k][j])。
      • 加法前务必判定有限以避免溢出或无效比较。
    2. 负环检测与影响传播
      • 若 m[k][k] < 0,存在经过 k 的负环。
      • 对所有 i,j:若 m[i][k]、m[k][j] 有限,则将 m[i][j] 置为 -inf(一次或两次额外循环传播,确保“经任一负环可达”的对被标注)。
    3. 不可达保持
      • i 无法到达 j 的情形,m[i][j] 维持为 inf。
  • 复杂度与边界条件

    • 时间/空间:O(N^3)/O(N^2)。
    • 权值:允许负权;重边按最小权自然生效;自环可参与负环判定。
    • 数值安全:对 inf 做短路判断,避免 inf + 有限 导致溢出或伪优。
    • 路径重构:可维护 next/pre 矩阵进行路径还原,需 O(N^2) 额外空间。
  • 变体/扩展与关系

    • Warshall 传递闭包:将“加/取最小”替换为“与/或”得到可达性闭包。
    • 半环推广:在一般 (⊕,⊗) 代数结构下作为闭包运算模板。
    • 对比:与 052-图论-贝尔曼福德(单源、可判负环)、Dijkstra(非负权时更快)互补;当仅需少量源点时更宜选单/多源算法。
  • 正确性要点与不变式

    • 第 k 轮后,m[i][j] 等价于仅允许使用 {0..k} 中间点的最短路值;由归纳可得最终收敛。
    • 若存在 m[k][k]<0,则任何经 k 可达的 i→j 可被负环无限改善,故以 -inf 表示其下界趋于 -∞。
  • 与相邻技术的对比与取舍建议

    • 规模与密度:N 较小且需全源最短路时选 FW;大图或仅少量源点选 Bellman-Ford/Dijkstra/多源队列法。
    • 负环处理:FW 可一次性得到所有负环影响域;若仅需检测某源的负环影响,单源算法足矣。
  1. 关联节点