Skip to content

模型Model

最短路问题

Shortest-path problem

在有限有向实权图中寻找源点到各顶点的最小有向游走成本。

形式陈述 ​

设 D 为有限有向图,采用保留弧身份的变体:顶点集为 V、弧集为 A,每条弧有指定起终点,允许自环和平行弧。弧权函数 w:A→R 取值于实数系。固定源点 s∈V。对从 s 到 v 的有向游走

W=(v0=s,a1,v1,…,ak,vk=v),

其中 ai 的起终点为 vi−1,vi,定义游走成本

w(W)=∑i=1kw(ai),δ(s,v)=inf{w(W):W 是 s 到 v 的有向游走}.

若 v 从 s 不可达,约定 δ(s,v)=+∞。长度为零的空游走给出 δ(s,s)≤0;若没有可由 s 到达且还能返回 s 的负权圈,则等号成立。若存在从 s 可达、且还能到达 v 的负权有向圈,则可在前往 v 前把该圈重复任意多次,故 δ(s,v)=−∞。除此之外,δ(s,v) 若有限便由一条简单有向路达到:任意游走中重复顶点之间形成有向闭游走;其中若含负圈便落入前述 −∞ 情形,否则可删去一个非负闭合段而不增加成本,反复删除后只剩至多 |V|−1 条弧。

以下将一条指定的 u→v 弧权简写为 w(u,v);平行弧须分别处理。对每条这样的弧,扩展实数意义下的三角不等式为

δ(s,v)≤δ(s,u)+w(u,v).

松弛操作维护距离上界 d,尝试令

d[v]←min{d[v],d[u]+w(u,v)}.

通常初始化 d[s]=0、其余为 +∞。若程序用有限整数代替无穷,必须先检查 d[u] 确实可达再做加法;否则哨兵加负权可能伪造一条不存在的路径。距离下降时记录前驱弧,才能在有限最优情况下恢复路线;仅有距离数组并未直接给出路径。

每个有限估计都应由一条已发现游走见证,因此不会凭空低于真实有限最短距离。若一条 s 到 v 的最短路经过 u,其到 u 的前缀也必须最短;否则用更短前缀替换便会改进整条路。这一最优子结构和“信息以什么顺序传播”是两件事,后者取决于权重条件与具体算法。

直觉

最短路按整条路线的可加成本比较,不按边数或某条局部最轻边决胜。松弛把一个已有前缀再延伸一步;当所有相关三角约束都稳定时,每个可达且不受负圈影响的顶点才得到最终距离。

边权决定可采用的传播顺序。非负权让距离波前只能向外增长,Dijkstra 因而可以永久结算最小候选;允许负边时,后来发现的路线可能反超早先候选,Bellman–Ford 要容许反复修正;DAG 没有回流,按拓扑序扫描一次即可,即使边权为负。

用游走定义 δ 可以如实表示负圈造成的无界下降。若只在有限多条简单路中取最小值,即使存在可利用的负圈也会返回一个有限数,从而掩盖“成本可任意降低”这一算法上不可忽略的事实。

最短距离与最短路树
例子与边界

弧 s→a、a→t、s→t 的权依次为 2,3,6 时,路线 s→a→t 的成本 5 优于直达弧。把 a→t 改为 −4 后,最短成本变为 −2;一条负边没有使问题失去定义,只使依赖非负性的结算方法不再可靠。若再加入 t→a、权 1,则圈 a→t→a 总权为 −3,从圈可达的 a,t 距离均为 −∞。

在最初的非负权例子中,先松弛源点得到 d[a]=2,d[t]=6;再松弛 a→t,候选值 2+3=5 改进 d[t],同时把 t 的前驱改为 a。负边破坏结算的更直接反例是 s→a:2,s→b:5,b→a:−4:若把距离 2 的 a 永久结算,后来经 b 得到的真正最短距离 1 就无法纠正。原图甚至无环,所以失败原因是非负权假设缺失,而非必须存在负圈。

若另有负圈 x→y→x,但 x,y 从 s 不可达,它不会影响这次单源查询;两点距离仍为 +∞。同样,可达负圈若不能再到达某个顶点 v,也不会把 δ(s,v) 变成 −∞。零权圈不会改变最短值,却会产生无限多条等成本最优游走;仍可删圈得到一条简单最短路。

请求多个不同答案时,必须重新约定输出身份。Yen算法枚举禁止重复顶点的简单路径,有限多条耗尽后结束;Eppstein方法允许重复顶点,按弧ID序列区分游走,借偏离差价与共享堆输出有限k份隐式记录。零权环下可能已有无限多份最低成本答案,不能要求先输出这些再进入更贵一层,也不能把隐式记录成本冒充完整路线长度。

平行弧应保留各自权重与身份,不过只求距离时,同方向端点相同的弧只保留最小权者也不改变答案。无权图可把每条弧权设为 1,用 BFS 求最少弧数;多源问题可加入到各源的零权超级源。若成本依赖到达时刻、前一条边或不可相加的多重指标,就必须扩展状态或改变代价代数,普通最短路模型不再充分。

最轻奇支撑圈把每个顶点扩成奇偶两层:经过标记边翻层,其他边留层。对全部原顶点v求(v,0)到(v,1)的最短路,再把最轻投影闭走提取为简单圈,得到圈基算法使用的oracle;只查一个起点或把重复边投影直接当圈都会漏掉证明义务。

推论与应用

Dijkstra处理非负权单源情形,Bellman–Ford允许负边并检测源可达负圈,Floyd–Warshall用矩阵动态规划求所有点对距离。Johnson 算法先以势函数消去负边,再在稀疏图上逐源运行 Dijkstra;A*面向单目标查询,用可证明的下界改变候选展开次序。这些算法求解同一模型的不同输入区域,权重假设不能互换。

最短路树与最小生成树的目标不同。前者固定源点并分别最小化根到各顶点的距离;后者最小化整棵连接树的边权总和。三角形边权 w(sa)=2,w(ab)=2,w(sb)=3 时,从 s 的最短路树取 sa,sb,总权 5;MST 取 sa,ab,总权 4,但树上 s 到 b 的距离 4 又大于原图的 3。

逐次最短路最小费用流把最短路作为残量网络中的反复增广子程序,并用势维持约化成本非负;其目标是满足流量约束下的总费用最小,而非只输出一条 s⇝t 路径。动态图、时间依赖权和多准则成本也需要另行规定更新接口与代价代数,不能从静态可加边权模型直接外推。

连续平面避障问题还需证明图模型没有漏掉最短路线:可见图利用最短路只在多边形角点转弯的结构,构造精确图归约;无孔房间也可通过三角形通道和双链漏斗直接计算最短路。

参考资料
  • Robert Sedgewick、Kevin Wayne,Algorithms,第 4 版,2011,§4.4 Shortest Paths:距离初始化、边松弛与负权边边界。

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Chs. 22–23, single-source and all-pairs shortest paths。

  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,Chs. 4 and 6, shortest paths with nonnegative and general edge costs。

关系图谱29 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系