一、图的概念
- 图
G
=(V, E)。顶点(就是结点)V
,边E
,权值w
。 - 路径
p
: v 1 → v 2 → . . . → v k v_1 \to v_2 \to ... \to v_k v1→v2→...→vk,其 w ( p ) = ∑ i = 1... k − 1 w ( v i , v i + 1 ) w(p)=\displaystyle \sum_{i=1...k-1}w(v_i,v_{i+1}) w(p)=i=1...k−1∑w(vi,vi+1) - 最短路径 δ ( u , v ) \delta(u,v) δ(u,v):从u顶点到v顶点
δ ( u , v ) = { m i n { w ( p ) } if 有从p到v的路径 ∞ if 不连通 \delta(u,v) = \begin{cases} min\{w(p)\} &\text{\small if 有从p到v的路径} \\ \infty &\text{\small if 不连通} \end{cases} δ(u,v)={min{w(p)}∞if 有从p到v的路径if 不连通
-
松弛定理Relax
δ ( u , v ) ≤ δ ( u , x ) + δ ( x , v ) \delta(u,v) \leq \delta(u,x)+ \delta(x,v) δ(u,v)≤δ(u,x)+δ(x,v)
理解: δ ( u , v ) \delta(u,v) δ(u,v)是u和v之间的最短路径, δ ( u , x ) + δ ( x , v ) \delta(u,x)+ \delta(x,v) δ(u,x)+δ(x,v)表示的是u和v之间的某一条路径,那么最短路径肯定是所有u和v之间路径最小的一条,所有是"≤"。
-
负权环
意思是整个环路的总权值为负。这样就可能出现只要我一直沿着这个负权环转,那么我就会获得一个更小的总权值代价。
-
有向图和无向图
- 有向图:(A→B,A←B,A ⇆B)只能按照箭头方向走
- 无向图:(A——B)AB之间互通,即就是全双向的有向图
二、对图的要求
【求最短路径的前提:well-definedness of shortest paths(不能有负权环存在)】
负权值的环路是指一个环路总的权值为负,而不是不能存在负权值的边。
所以当有负权环存在时,是求不出最短路径的。
三、最短路径算法
有两种形式:
- 单源点:意思是要从点A到各点BCD的最短路径,AB,AC,AD
- 多源点:每个点都是单源点,ABCD各点之间的最短路径,AB,AC,AD,BC,BD,CD
1.单源点 single-source
- 无负权值边:Dijkstra
图算法:最短路径算法之dijkstra - 通用(允许有负权值边和能判断负权环):Bellman-Ford
【Floy-Warshall】
c i j ( k ) = m i n k { c i j ( k − 1 ) , c i k ( k − 1 ) + c k j ( k − 1 ) } c_{ij}^{(k)}=min_k\{c_{ij}^{(k-1)},c_{ik}^{(k-1)}+c_{kj}^{(k-1)}\} cij(k)=mink{cij(k−1),cik(k−1)+ckj(k−1)}
- 行表示出发点,列表示到达点(行出列入)。
- c0表示直接相连的,c1表示经过v1的,c2表示经过v2的。
2.多源点 all-pairs
- 单源点算法对每个顶点用一遍:
- 无负权值边:Dijkstra
- 通用(允许有负权值边和能判断负权环):Bellman-Ford
- 另外提出的: