导言
最短路径问题是图论领域中的核心问题之一,也是许多更深层次算法的基础。在日常生活中最短路径算法也被大量的应用,不仅仅包括简单的地图上的寻路问题,还包括了许多较为抽象的、看似与路径问题无关的、但也可以归结为最短路径的问题。
一个简单的生活中常见例子:一名教授希望找到一条从北京到上海的最短路径,给定一张中国的道路交通图,上面标有所有的相邻城市之间的距离,这位教授应该怎样找到这样一条最短的路径呢?对于这样一个简单的寻找最短路径的问题,凭感觉找便可以快速找到一条较短的路线。但如果在较为复杂的问题条件下,并要求必须找到一条数学意义上的最短路径,则必须通过一定的算法实现。最根本的思想是将从北京到上海之间可以经过的所有路线都找出来,然后依次算出每种路线的距离,并选出其中距离最短的路径。显然对于一张高度连通的图,这样的做法复杂度是无穷大的,并且会包含很多无意义的计算,例如从北京到乌鲁木齐,再到上海,这样一条路径就是没有计算的意义的。
同样,我们也可以将许多较为抽象的问题化为最短路径问题。例如套利交易问题中,我们可以用权重值代表不同货币之间的汇率,再运用算法来寻找获利的路线,此问题将在下文中具体阐释。我们将要用到一些算法来高效的解决这个问题,本文将阐述其中的部分原理。
基本定义与延伸
基本概念与定义
在生活中寻路的例子中,我们可以把地图化作一幅图,其中每个结点表示路口或是可以到达的地点,每条边表示连接结点的道路表示,每条边的权重代表这条路的距离。首先我们定义一个最短路径的案例应当发生在一个带权重的有向图 G = ( V , E ) G=(V,E) G=(V,E)中以及对于有向图中的每一条边的权重都有权重函数 w w w: E → R E\rightarrow \textbf{R} E→R,对于图中的一条路径 p = ⟨ v 0 , v 1 , … , v k ⟩ p=\langle v_0,v_1,\dots,v_k\rangle p=⟨v0,v1,…,vk⟩ 的权重(也就是通俗的距离) w ( p ) w(p) w(p)是构成该路径的所有边的权重之和:
w ( p ) = ∑ i = 1 k w ( v i − 1 , v i ) w(p)= \sum_{i=1}^k w(v_{i-1},v_i) w(p)=i=1∑kw(vi−1,vi)
令从结点 u u u到结点 v v v的最短路径权重为 δ ( u , v ) \delta (u,v) δ(u,v)。
边的权重只是一种度量方法,而并不只能代表距离。在不同的案例中,也可以代表不同的含义,例如损失、金钱和其他会沿路线积累的属性。
概念延伸
引理 对于有向图 G = ( V , E ) G=(V,E) G=(V,E),和路径 P = ⟨ v 1 , v 2 , … , v k ⟩ P=\langle v_1,v_2,\dots ,v_k \rangle P=⟨v1,v2,…,vk⟩为已知的 v 1 , v k v_1, v_k v1,vk之间的最短路径,我们设 1 < i < j < k 1<i<j<k </