无权图全源最短路的快速算法

论文 On the All-pairs-shortest-path Problem. Raimund Seidel, 1992 阅读笔记。这篇文章给出了一个在 O(M(n)logn)O(M(n)\log n) 时间复杂度内计算出无向无权图全源最短路长度的算法,和一个在 O(M(n)logn)O(M(n)\log n) 时间复杂度内找出全源最短路的随机算法,其中 M(n)M(n) 为对两个 n×nn\times n 的小整数矩阵做乘法的时间复杂度(注意:如果有 M(n)=O(n2)M(n)=O(n^2),则找出全源最短路时间复杂度为 O(n2log2n)O(n^2\log^2 n))。该算法还可以推广到有向无权图上。

计算全源最短路长度的算法

G=V,EG=\langle V,E\rangle 是一个顶点集合 V={1,2,,n}V=\{1,2,\ldots,n\} 的无向无权连通图(先讨论这种情况,剩下情况在最后一节补充),而 An×nA_{n\times n}GG 的邻接矩阵。我们现在要计算 dij(1i,jn)d_{ij}\,(1\le i,j\le n) 表示编号为 i,ji,j 点之间的最短路长度。

命题 11设矩阵 Z=A2Z=A^2,对于任何 1i,jn1\le i,j\le n,如果 dij2d_{ij}\le 2,则 zij>0z_{ij}>0

证明几乎显然。

然后让 G=V,EG'=\langle V,E'\rangle 为一张新图,而一条边 (u,v)E(u,v)\in E' 当且仅当 uvu\ne vduv2d_{uv}\le 2。可以发现 (u,v)E(u,v)\in E' 当且仅当 aij=1a_{ij}=1zij>0z_{ij}>0

再设 tijt_{ij} 为在 GG' 中编号为 i,ji,j 点之间的最短路长度。

命题 22对于任何 1i,jn1\le i,j\le n:如果 dijd_{ij} 为偶数,则 dij=2tijd_{ij}=2t_{ij};如果 dijd_{ij} 为奇数,则 dij=2tij1d_{ij}=2t_{ij}-1

证明:分两种情况讨论:

  • 如果有:dij=2s(sN)d_{ij}=2s\,(s\in \mathbb N),则设在图 GGi,ji,j 间最短路为 v0=i,v1,v2s1,v2s=jv_0=i,v_1\ldots,v_{2s-1},v_{2s}=j。则显然 v0=i,v2,,v2s2,v2s=jv_0=i,v_2,\ldots,v_{2s-2},v_{2s}=j 是图 GG'i,ji,j 间的最短路,所以 dij=2tijd_{ij}=2t_{ij}
  • 如果有:dij=2s1(sN+)d_{ij}=2s-1\,(s\in \mathbb N^+),则设在图 GGi,ji,j 间最短路为 v0=i,v1,v2s2,v2s1=jv_0=i,v_1\ldots,v_{2s-2},v_{2s-1}=j。则显然 v0=i,v2,,v2s2,v2s1=jv_0=i,v_2,\ldots,v_{2s-2},v_{2s-1}=j 是图 GG'i,ji,j 间的最短路,所以 dij=2tij1d_{ij}=2t_{ij}-1

得证。\Box

δ(G)\delta(G) 为图 GG 的直径(两点间最短路长度的最大值),由命题 22 可可知:将图 GG 上的问题转化为图 GG' 上的问题,直径大致减半,更具体的有:δ(G)=δ(G)/2\delta(G')=\lceil \delta(G)/2\rceil。这也是这个算法减小问题规模的关键。

现在的最主要问题变为判断 dijd_{ij} 的奇偶性,如果这一问题得以解决,就可以不断递归到直径更小的问题上,最后直径不超过 22 的时候结束递归。

为解决这一问题我们先给出一个极其显然的定理:

命题 331i,jn1\le i,j\le niji\ne j。则对于在图 GG 与点 jj 有连边的点 kk,都有:dij1dikdij+1d_{ij}-1\le d_{ik}\le d_{ij}+1,并且一定存在一个 kk 使得 dik=dij1d_{ik}=d_{ij}-1

这个即是最短路的三角不等式在无向无权图上的直接运用。

命题 441i,jn1\le i,j\le niji\ne j。则如果有 dijd_{ij} 为偶数,则对于任何在 GG 中与点 jj 有连边的点 kk 都有 tiktijt_{ik}\ge t_{ij};如果有 dijd_{ij} 为奇数,则对于任何在 GG 中与点 jj 有连边的点 kk 都有 tiktijt_{ik}\le t_{ij},并且一定会有一个 kk 使得 tik<tijt_{ik}<t_{ij}

证明:分两类情况讨论:

  • dij=2s(sN)d_{ij}=2s\,(s\in \mathbb N),则有命题 33 可得对于任何在 GG 中与点 jj 有连边的点 kk 都有 dik2s1d_{ik}\ge 2s-1,那么再由命题 22 可推出 tiks=tijt_{ik}\ge s=t_{ij}
  • dij=2s1(sN+)d_{ij}=2s-1\,(s\in \mathbb N^+),则有命题 33 可得对于任何在 GG 中与点 jj 有连边的点 kk 都有 diks1d_{ik}\le s-1,并且一定存在一个 kk 使得 dik=2s2d_{ik}=2s-2,那么再由命题 22 可推出另一半结论。

得证。\Box

作为命题 44 的直接推论,我们得到命题 55

命题 55对于任何 1i,jn1\le i,j\le ndijd_{ij} 为偶数当且仅当 (k,j)EtiktijdegG(j)\sum\limits_{(k,j)\in E}t_{ik}\ge t_{ij}\cdot \text{deg}_G(j)dijd_{ij} 为奇数当且仅当 (k,j)Etik<tijdegG(j)\sum\limits_{(k,j)\in E}t_{ik}< t_{ij}\cdot \text{deg}_G(j),其中 degG(v)\text{deg}_G(v) 表述在图 GG 中点 uu 的度数。

证明便是反证然后导出与命题 44 间的矛盾。

注意到 (k,j)Etik=k=1ntikakj\sum\limits_{(k,j)\in E}t_{ik}=\sum\limits_{k=1}^nt_{ik}a_{kj},于是我们定义矩阵 X=TAX=TA,则判断 dijd_{ij} 的奇偶性可以变为判断 xijx_{ij}tijdegG(j)t_{ij}\cdot\text{deg}_G(j) 的大小关系。

这样我们就可以得到算法的伪代码:

伪代码第 99 行的 degA(v)\text{deg}_A(v) 表示邻接矩阵为 AA 的图(不计重边则是唯一的)中 vv 的度数。

T(n,δ)T(n,\delta) 为对一个有 nn 个点且直径为 δ\delta 的图执行如上算法的时间复杂度,则有:

T(n,δ)={M(n)+O(n2)δ2T(n,δ/2)+2M(n)+O(n2)δ>2T(n,\delta)= \begin{cases} M(n)+O(n^2) & \delta\le 2 \\ T(n,\lceil \delta/2\rceil)+2M(n)+O(n^2) & \delta>2 \end{cases}

易得:

T(n,δ)=(2log2δ1)M(n)+O(n2logδ)=O(M(n)logn)T(n,\delta)=(2\lceil\log_2\delta\rceil-1)M(n)+O(n^2\log \delta)=O(M(n)\log n)

上述推导用到了 δ=O(n)\delta=O(n)M(n)=Ω(n2)M(n)=\Omega(n^2),其中 M(n)M(n) 为对两个 n×nn\times n 的小整数矩阵做乘法的时间复杂度,有 M(n)=O(n2.376)M(n)=O(n^{2.376})

找到全源最短路的随机算法

注意这里的「找到」指的不是对每一对 i,ji,j 都输出从 iijj 上最短路的每一个点。因为如果这样这个问题不可能在 o(n3)o(n^3) 内解决(Θ(n2)\Theta(n^2) 对点,每对点间距离为 O(n)O(n))。

这个算法「找到」的是「后继矩阵」Sn×nS_{n\times n},对于每个 iji\ne jsijs_{ij} 的值表示与 ii 相邻且在 iijj 最短路上的点的编号,如果有多个这样的点任取一个。显然这样的「后继矩阵」可以更高效的表示全源最短路。

我们来定义一个新的 0101 矩阵乘法 \circ(原文叫 the boolean product witness matrix,原谅我不会翻译)。有两个 0101 矩阵 A,BA,B,则我们定义 W=ABW=A\circ B 满足如下条件:

wij={some k such that aik=1 and bkj=1, and0 if no such k exists.w_{ij}= \begin{cases} \text{some }k\text{ such that } a_{ik}=1\text{ and }b_{kj}=1\text{, and} \\ 0\text{ if no such }k\text{ exists.} \end{cases}

这里的 some 表示了如果有多个这样的 kk 任取一个的意思。对于满足 aik=bkj=1a_{ik}=b_{kj}=1kk,我们称 kk(i,j)(i,j) 的一个 witness。

现在我们先使用上一节的算法求得了全源最短路的长度,并将 dijd_{ij} 存在矩阵 Dn×nD_{n\times n} 里面。那么显然 sij=ks_{ij}=k 等价于 dkj=dij1d_{kj}=d_{ij}-1aik=1a_{ik}=1

那么我们可以将 SS 表示为如下形式:

sij=(AQ(l))ij, with l=dijs_{ij}=(A\circ Q^{(l)})_{ij},\text{ with }l=d_{ij}

其中 qij(l)=[dij=l1]q^{(l)}_{ij}=[d_{ij}=l-1]

要计算 n1n-1\circ 显然太慢了。这里有一个 key observation 就是说由命题 33 可得:dij1dkjdij+1d_{ij}-1\le d_{kj}\le d_{ij}+1,于是你发现其实 sij=ks_{ij}=k 等价于 aik=1a_{ik}=1dkjdij1(mod3)d_{kj}\equiv d_{ij}-1\pmod 3。也就是说 dd 都可以模一个 33,所以我们改写一下 Q(l)Q^{(l)} 的定义:qij(l)=[dijl1(mod3)]q^{(l)}_{ij}=[d_{ij}\equiv l-1\pmod 3],上面的表示只剩下三项:

sij=(AQ(l))ij, with l=dijmod3s_{ij}=(A\circ Q^{(l)})_{ij},\text{ with }l=d_{ij}\bmod 3

接下来先给一个整个算法的伪代码,然后再进行分析:

我们先 BPWM\text{BPWM} 函数进行时间复杂度分析。对于伪代码第 331010 行的循环,设 M(n)=O(nω)M(n)=O(n^\omega),则将 n×dn\times dd×nd\times n 两个矩阵相乘的时间复杂度为 O(n2dω2)O(n^2d^{\omega-2})。所以这个循环时间复杂度表达式如下:

pl=0log2n1(O(n2)+O(n2(2l)ω2))={O(pnω)ω>2O(pn2logn)ω=2p\sum_{l=0}^{\lceil \log_2 n \rceil -1}\Big(O(n^2)+O(n^2(2^l)^{\omega-2}) \Big)= \begin{cases} O(p\cdot n^\omega) & \omega>2 \\ O(p\cdot n^2\log n) & \omega=2 \end{cases}

接下来我们将分析如何选取 pp 使得伪代码第 11111313 行的循环期望时间为 O(n2)O(n^2)。更具体的,我们分析对于任何 (i,j)(i,j),其存在一个 witness,但是在第一个循环中没有找到的概率至多为 1/n1/n

命题 66对于 BPWM\text{BPWM} 第一个循环(伪代码第 331010 行)与任意的数对 (i,j)(i,j),如果 k1,k2,,kdk_1,k_2,\ldots,k_d 中恰有一个是 (i,j)(i,j) 的 witness,不妨设为 kνk_\nu,则 cij=kνc_{ij}=k_\nu

证明:因为只有 kνk_\nu 满足 aikν=bkνj=1a_{ik_\nu}=b_{k_\nu j}=1,故 cij=r=1dkraikrbkrj=kνc_{ij}=\sum\limits_{r=1}^d k_ra_{ik_r}b_{k_r j}=k_\nu\Box

对于任意数对 (i,j)(i,j),如果其没有 witness,则在执行完伪代码第 22wijw_{ij} 便是 00,之后 wij<0w_{ij}<0 的条件也一直不会被触发,无需考虑。

否则如果 (i,j)(i,j) 有 witness,且一共有 c(c>0)c\,(c>0) 个 witness。假设有一次过程中 dd 满足 n/2cdnn/2\le cd\le n(因为 dd 取遍所有不超过 nn22 的次幂,所以这样的 dd 一定存在),下面这个命题指出,「k1,k2,,kdk_1,k_2,\ldots,k_d 中恰有一个 witness」这个事件为假的概率不超过 112e1-\dfrac 1{2\text{e}},其中 e\text{e} 是自然对数的底数。又因为只要有「k1,k2,,kdk_1,k_2,\ldots,k_d 中恰有一个 witness」成立,则 (i,j)(i,j) 的 witness 便被找到,所以经过循环后 (i,j)(i,j) 的 witness 没被找到的概率也不超过 112e1-\dfrac 1{2\text e}

命题 77一个袋子里有 nn 个球,其中有 c(cn)c\,(c\le n) 个红球,剩下是蓝球。进行 dd 次抽取放回过程,其中 dd 满足 n/2cdnn/2\le cd\le n,假设每次抽取抽到每个球的概率都是 1/n1/n。则这 dd 次恰有一次抽出红球的概率至少是 12e\dfrac 1{2\text{e}}

证明:这个事件概率的表达式显然是:

dcn(1cn)d1d\cdot \dfrac cn\left(1-\dfrac cn\right)^{d-1}

又因为 n/2cdnn/2\le cd\le n,所以有:dcn12\dfrac{dc}n\ge \dfrac 12cn1d\dfrac cn\le \dfrac 1d。所以将上式进行放缩:

dcn(1cn)d112(11d)d1>12ed\cdot \dfrac cn\left(1-\dfrac cn\right)^{d-1}\ge \dfrac 12\left(1-\dfrac 1d\right)^{d-1}>\dfrac 1{2\text{e}}

得证。\Box

我们又将关于 dd 的循环重复了 pp 遍,令 (112e)p1n\left(1-\dfrac 1{2\text e} \right)^p\le \dfrac 1npp 的最小值为 lnn/ln(112e)-\ln n/\ln\left(1-\frac 1{2\text e}\right),是 O(logn)O(\log n) 级别的。

故可写出最后的时间复杂度表达式:

{O(nωlogn)ω>2O(n2log2n)ω=2\begin{cases} O(n^\omega \log n) & \omega>2 \\ O(n^2\log^2 n) & \omega=2 \end{cases}

补充

GG 不连通这个算法仍适用,只是如果 (i,j)(i,j) 间没有路径,则 dij=0d_{ij}=0。那么判断一下如果 iji\ne jdij=0d_{ij}=0,那么 (i,j)(i,j) 间的路径一定不存在。

GG 是有向图也是适用的,我们只需要把 Work\text{Work} 函数的伪代码中,第九行 degA(v)\text{deg}_A(v) 的含义由度数改为入度即可。

这个算法实践中并不快,一是因为快速的矩阵乘法常数大,二是递归时的开销不小。

参考文献

[1] On the All-pairs-shortest-path Problem. Raimund Seidel, 1992.