最短路径问题:一个带权重的有向图G = (V, E)和权重函数w: E->R,该权重函数将每条边映射到实数值的权重上。一条路径p的权重w(p)是构成该路径的所有边的权重之和,定义从节点u到结点v的最短路径权重δ (u, v)如下:
在实际应用中,可以用一张图表示道路交通图,结点代表城市,边代表城市之间的道路,边上的权重代表道路的长度。目标就是找出一条从城市A到城市B的最短路径,边上的权重还可以表示时间、费用、罚款、损失或者任何随路径长度的增加而线性积累的,并且需要最小化的数量。
广度优先搜索算法就是一个求取最短路径的算法,但该算法只能用于无权重的图,即每条边的权重都是单位权重的图。
本章讨论单源最短路径问题:给定图G=(V, E),希望找到从给定源节点s到每个结点v的最短路径。单源最短路径可以有下面的变体:
单目的地最短路径问题:找出从每个顶点v到指定终点t的最短路径。把图中的每条边反向,就可以把这一问题变为单源最短路径问题。
单结点对最短路径问题:找到从给定结点u到给定结点v的最短路径。解决了单源最短路径问题,则这一问题也就获得解决。
所有节点对最短路径问题:对于每对顶点u和v,找出从u到v的最短路径。虽然将每个顶点作为源点,运行一次单源算法就可以解决这一问题,但通常可以更快地解决这一问题,下一章将详细讨论这个问题。
一:概述
1:最短路径的最优子结构
最短路径具有最优子结构性质:两个结点之间的一条最短路径包含其他的最短路径:
给定带权重的有向图G=(V, E)和权重函数w。设p=< >为从节点
到结点
的一条最短路径,并且对于任意的i, j, 0 <= i <= j <= k,设
= <
>为路径p中从节点
到结点
的子路径。那么
是从
到节点
的一条最短路径。
2:负权重的边
边的权重可以为负值,即使边的权重为负值,对于所有节点v,最短路径权重 (u, v)都可以有精确定义。但是,如果图G=(V, E)包含从源节点s可以到达的,权重为负值的环路,则最短路径权重无定义,从s到该环路上的任意节点的路径都不可能是最短路径。如果从节点s到节点v的某条路径上存在权重为负值的环路,则(u, v) = -∞。
如下图所示:
从节点s到节点c有无数条路径;<s,c>, <s,c,d,c>,<s,c,d,c,d,c>等,因为环路<c, d, c>的权重为3>0。所以从s到c的最短路径为<s,c>,δ(s, c)=5。
从节点s到节点e也有无数条路径:<s,e>, <s,e,f,e>, <s,e, f,e, f,e >等,因为环路<e, f, e>的权重为-3,所以,从节点s到节点e没有最短路径,因此δ(s,e)=-∞。类似的, δ(s,f)=-∞。因为g可以从节点f到达,所以, δ(s, g)=-∞。
节点<h,i,j>也形成一个权重为负数的环路,但是他们不能从节点s到达,所以: (s, h) = (s, i) = (s, j) = ∞ 。
4:环路
最短路径不能包含权重为负值的环路。而且,最短路径也不能包含权重为正值得环路。因为只要将环路从路径上删除就可以得到一条权重更小的路径。