最小环基(Minimal Cycle Basis,中文翻译是我随便取的)是图论的一个具体的研究问题。借着华为 Hackathon 2023 的机会,我决定对学界的 Minimal Cycle Basis 问题做一次系统性地调研。

概念和记号表示

考虑不存在重边、自环的无向/有向图 G=(V,E)G=(V,E),点没有权重,边可以有权重。

记号 含义
n,mn,m GG 中的点数和边数,即 $n=
x,yx,y GG 中的某两个顶点,即 x,yVx,y \in V
ee GG 中的某条边,即 eEe \in E
P(x,y)P(x,y) xxyy 的某条最短路径的边集
BB GG 的某一个环基
CC GG 的某一个环
TT GG 的某一个生成树
TxT_x GG 中以 xx 为根的最短路径树

:环是一个边的子集,满足导出子图连通且每个点的度数都是偶数。简单环 额外要求每个点的度数都是 22

环的和:对于两个环 C1,C2C_1,C_2,定义它们的 为这两个集合的对称差,即 Csum=(C1C2)(C1C2)C_{sum}=(C_1 \cup C_2)-(C_1 \cap C_2),简记为 Csum=C1+C2C_{sum}=C_1+C_2。容易发现,两个环的和一定是空集、一个合法的环或两个不相交的环。

环的向量表示:我们可以用一个长度为 V|V| 的 01 向量 vv 表示一个简单环,vi=1v_i=1 当且仅当环中包含点 ii。那么两个环的和的向量表示是 vsum=v1v2v_{sum}=v_1 \oplus v_2

环空间:对于环集 D0={C1,C2,,Cl}D_0=\{C_1,C_2,\dots,C_l\},设环集序列 Di={Ci+CjCi,CjDi1}D_i=\{C_i + C_j | C_i,C_j \in D_{i-1}\},称 D+D_{+\infty} 为环集 CC 导出的环空间。显然有 D+={k1C1+k2C2++klCl}D_{+\infty}=\{k_1C_1+k_2C_2+\dots+k_lC_l\},其中 ki={0,1}k_i=\{0,1\}

环基:环空间覆盖了图上所有环的环集成为环基。环基里每一个环的向量都是线性无关的,而且它们能线性表出整个环空间。设 BB 是一组环基,则有 B=mn+1|B|=m-n+1。边权和最小的环基即为 最小环基

Horton 1984:第一个多项式做法

对于边可以带权的 无向图,提出了 MCB 的第一个多项式做法,复杂度为 O(m3n)O(m^3n)

定理 0:若 CBC \in BC=C1+C2C=C_1+C_2,那么环集 (BC)C1(B-C) \cup C_1 和环集 (BC)C2(B-C) \cup C_2 一定有一个是环基。

定理 1:环基中一定存在一个环 CC 满足 CC 是最小环。

定理 2:若 CBC \in Bx,yCx,y \in C,那么 P(x,y)CP(x,y) \subseteq C

定理 3:若 CBC \in B,对于任何 xCx \in C,存在 e=(y,z)e=(y,z) 使得 C=P(x,y)P(x,z){e}C=P(x,y) \cup P(x,z) \cup \{e\}

定理 4:若 e=(x,y)e=(x,y),包含 ee 的最小环 CeC_e 满足 CeC_e 在某一个合法环基里。

基本算法:按下列步骤可以求得一个 GG 的环基:

  1. 对于所有点对 (x,y)(x,y),计算 P(x,y)P(x,y)
  2. 枚举所有点边对 v,(x,y)v,(x,y),创建环 C(v,x,y)=P(v,x)P(v,y){(x,y)}C(v,x,y)=P(v,x) \cup P(v,y) \cup \{(x,y)\}
  3. 按边权和从大到小枚举每一个环,能选就选。用高斯消元来判定。

复杂度分析:第 2 步会构造出 O(nm)O(nm) 个环。每个环用向量表示,构成了 O(nm)×mO(nm) \times m 的矩阵。第 3 步里从前往后枚举每一行,如果不是全零就选上,然后向后做一遍消元。不妨设环基的元素个数是 d=mn+1d=m-n+1,总共会消元 O(nm)×dO(nm) \times d 次,单次消元涉及 mm 列,所以总复杂度为 O(dm2n)=O(m3n)O(dm^2n)=O(m^3n)

加速:第 2 步生成环 C={x1,x2,,xk}C=\{x_1,x_2,\dots,x_k\} 后,可以花 O(k)O(k) 的时间利用定理 3 来检查这个环是否值得被尝试。具体来说,设 ri(1ik)r_i(1 \le i \le k)xix_i 向右最远衍生到的环上的点使得 P(xi,ri)={xi,xi+1,,ri}P(x_i,r_i)=\{x_i,x_{i+1},\dots,r_i\},同理 lil_i 是向左最远衍生的环点。当前环能在最小环基中的必要条件:对于任何 1ik1 \le i \le k(li,ri)(l_i,r_i) 是相邻的。利用这个性质可以对环进行提早剪枝,但作者并不会证明是否能降低复杂度。注意这个条件并不充分,存在相应的反例。

Pina 1995:基于代数图论

对于边可以带权的 无向图,提出了一个 O(m3+m2nlogn)O(m^3+m^2n \log n) 的基于代数图论的做法。

代数表示:任取 GG 的一棵生成树 TTEG\TE_{G \backslash T}GG 的非树边集合,不妨设 N=EG\TN=|E_{G \backslash T}|。对于图中任意一个环 CC,可以用 {0,1}N\{0,1\}^N 空间下的向量 vv 来表示:11 表示包含这条非树边而 00 表示不包含。

内积:定义 u,v\langle u,v\rangle 为两个环向量在 GF(2)GF(2) 下的内积。u,v=1\langle u,v\rangle=1 当且仅当环 uu 和环 vv 有奇数条公共边。

支持向量:环集 {C1,C2,,Ci1}\{C_1,C_2,\dots,C_{i-1}\} 的支持向量 SiS_i 满足:SiS_i 非平凡(Si0S_i \ne \mathbb{0})且 SiS_i 与所有 CjC_j 正交。

总体算法:假设当前已找到环基的前 i1i-1 个环 {C1,C2,,Ci1}\{C_1,C_2,\dots,C_{i-1}\},求出它们的任一支持向量 SiS_i

Ck,Si=0,k=1,2,,i1\langle C_k,S_i \rangle = 0, \quad k=1,2,\dots,i-1

在图中找到一个边权和最小的环 CiC_i 使得 Ci,Si=1\langle C_i,S_i \rangle=1,将其加入集合。重复操作直到加入 mn+1m-n+1 个环。

找正交环:把图中所有点 vVv \in V 拆成 (v0,v1)(v_0,v_1) 左右两个点,构造新图。枚举 e=(u,v)G\Te=(u,v) \in G \backslash T,如果 eSie \in S_i 就连接 (u0,v1)(u_0, v_1)(u1,v0)(u_1,v_0) 两条边,否则连接 (u0,v0)(u_0,v_0)(u1,v1)(u_1,v_1) 两条边。断言:新图中从任意 v0v_0 出发抵达 v1v_1 的路径,正好对应原图中包含 vv 且与 SiS_i 正交的环。需要对枚举所有 (v0,v1)(v_0,v_1) 找出最短路径,这是多源最短路。

维护支持向量:初始时设 Si={ei}(1iN)S_i=\{e_i\}(1 \le i \le N),这样所有支持向量彼此之间正交。增加 CiC_i 后更新 SjS_j

Sj={SjCi,Sj=0Sj+SiCi,Sj=1i+1jNS'_j=\left\{ \begin{aligned} S_j \quad & \langle C_i,S_j \rangle =0 \\ S_j+S_i \quad & \langle C_i,S_j \rangle =1 \end{aligned} \right. \quad i+1 \le j \le N

更新完后能保证 Si+1,Si+2,,SNS'_{i+1},S'_{i+2},\dots,S_N 是完全正交于 C1,C2,,CiC_1,C_2,\dots,C_i 的子空间。

复杂度分析:每一步求 CiC_i 的复杂度是多源最短路,需要跑 nn 遍堆优化的 Dijkstra,复杂度 O(nmlogn)O(nm \log n);每一步更新 Si+1,Si+2,,SNS_{i+1},S_{i+2},\dots,S_N 的复杂度是 O(m2)O(m^2)。重复 mn+1m-n+1 次,总复杂度为 O(m3+mn2logn)O(m^3+mn^2 \log n)

Kavitha 2004:分治加速支持向量

在 Pina 1995 的基础上,优化了求支持向量的部分,提出了复杂度为 O(mω+m2n+mn2logn)O(m^\omega+m^2n+mn^2 \log n) 的分治做法。当多源最短路退化时:整数边权的复杂度降低至 O(m2n)O(m^2n),而边不带权的复杂度进一步降低至 O(mω)O(m^\omega)

分治:设 F({C1,C2,,Ci},{Si+1,Si+2,,Si+k},k)F(\{C_1,C_2,\dots,C_i\}, \{S_{i+1},S_{i+2},\dots,S_{i+k}\}, k) 表示在前 ii 个环已经形成,{Si+1,Si+2,,Si+k}\{S_{i+1},S_{i+2},\dots,S_{i+k}\} 这些支持向量已正交于前 ii 个环,在此基础上求出 {Ci+1,Ci+2,,Ci+k}\{C_{i+1},C_{i+2},\dots,C_{i+k}\} 这些环。

  • 最外层调用 F(,{ {e1},{e2},,{eN} },N)F(\emptyset,\{~\{e_1\},\{e_2\},\dots,\{e_N\}~\},N) 即为答案。
  • k=1k=1,此时 Si+1S_{i+1} 一定已维护准确。重复找正交环的过程求出满足 Ci+1,Si+1\langle C_{i+1},S_{i+1} \rangleCi+1C_{i+1} 即可。
  • k>1k>1,那么将 {Si+1,Si+2,,Si+k}\{S_{i+1},S_{i+2},\dots,S_{i+k}\} 拆成两半 {Si+1,Si+2,,Si+mid}\{S_{i+1},S_{i+2},\dots,S_{i+mid}\}{Si+mid+1,,Si+k}\{S_{i+mid+1},\dots,S_{i+k}\}
    1. F({C1,C2,,Ci},{Si+1,Si+2,,Si+mid},mid)F(\{C_1,C_2,\dots,C_i\}, \{S_{i+1},S_{i+2},\dots,S_{i+mid}\}, mid) 求出前 midmid 个环和支持向量。不妨设更新后的支持向量为 {Ti+1,Ti+2,,Ti+mid}\{T_{i+1},T_{i+2},\dots,T_{i+mid}\}。显然 {Ti+1,Ti+2,,Ti+mid}\{T_{i+1},T_{i+2},\dots,T_{i+mid}\} 都正交于 {C1,C2,,Ci}\{C_1,C_2,\dots,C_i\}
    2. 利用 {C1,C2,,Ci}\{C_1,C_2,\dots,C_i\}{Ti+1,Ti+2,,Ti+mid}\{T_{i+1},T_{i+2},\dots,T_{i+mid}\} 去更新后半段的 {Si+mid+1,,Si+k}\{S_{i+mid+1},\dots,S_{i+k}\}
    3. F({C1,C2,,Ci},{Ti+mid+1,Ti+mid+2,,Ti+k},kmid)F(\{C_1,C_2,\dots,C_i\}, \{T_{i+mid+1},T_{i+mid+2},\dots,T_{i+k}\}, k-mid) 求出后 kmidk-mid 个环和支持向量。

考虑 k>1k>1 的第 2 步。我们希望更新 {Si+mid+1,,Si+k}\{S_{i+mid+1},\dots,S_{i+k}\} 使其能正交于 {Ci+1,Ci+2,,Ci+mid}\{C_{i+1},C_{i+2},\dots,C_{i+mid}\}。构造:

Tj=Sj+aj,1Ti+1+aj,2Ti+2++aj,midTi+midmid<jkT_j=S_j+a_{j,1}T_{i+1}+a_{j,2}T_{i+2}+\dots+a_{j,mid}T_{i+mid} \quad mid<j \le k

注意到 SjS_j{Ti+1,Ti+2,,Ti+mid}\{T_{i+1},T_{i+2},\dots,T_{i+mid}\} 本都正交于 {C1,C2,,Ci}\{C_1,C_2,\dots,C_{i}\},所以 TjT_j 一定与之正交。我们有 midmid 个自由系数 {aj,1,,aj,mid}\{ a_{j,1},\dots,a_{j,mid} \} 可以确定,想要使 TjT_j 正交于 midmid 个新环 {Ci+1,Ci+2,,Ci+mid}\{C_{i+1},C_{i+2},\dots,C_{i+mid} \},这是能办到的。

AX+Y=0,X={Ti+1,Ci+1  Ti+1,Ci+midTi+2,Ci+2  Ti+2,Ci+midTi+mid,Ci+2  Ti+mid,Ci+mid},Y={Ti+mid+1,Ci+1  Ti+mid+1,Ci+midTi+k,Ci+2  Ti+k,Ci+mid}AX+Y=0,X=\left\{\begin{aligned} \langle T_{i+1},C_{i+1} \rangle ~\dots & ~\langle T_{i+1},C_{i+mid} \rangle \\ \langle T_{i+2},C_{i+2} \rangle ~\dots & ~\langle T_{i+2},C_{i+mid} \rangle \\ \dots & \\ \langle T_{i+mid},C_{i+2} \rangle ~\dots & ~\langle T_{i+mid},C_{i+mid} \rangle \\ \end{aligned} \right\}, Y=\left\{\begin{aligned} \langle T_{i+mid+1},C_{i+1} \rangle ~\dots & ~\langle T_{i+mid+1},C_{i+mid} \rangle \\ \dots & \\ \langle T_{i+k},C_{i+2} \rangle ~\dots & ~\langle T_{i+k},C_{i+mid} \rangle \\ \end{aligned} \right\}

注意 XX 是上三角矩阵(左下块全 00),即 XX 一定可逆。系数矩阵 A=YX1A=YX^{-1}

分治复杂度分析:根据主定理,下列分治式子的综合复杂度为 O(m2n+mn2logn)O(m^2n+mn^2 \log n)

X={mn+n2lognk=12T(k/2)+O(kω1m)k>1X=\left\{\begin{aligned} mn+n^2 \log n & \quad k=1 \\ 2T(k/2)+O(k^{\omega-1}m) & \quad k>1 \end{aligned} \right.

α\alpha-近似算法:在每一轮找 Si,Ci\langle S_i,C_i\rangle 的最小环时 ,如果找到的环 DiD_i 满足 w(Di)αw(Ci)w(D_i) \le \alpha \cdot w(C_i),那么所得的环基 {D1,D2,,DN}\{D_1,D_2,\dots,D_N\} 的一定也满足 w(Di)αMCB\sum w(D_i) \le \alpha \cdot MCB。证明比较复杂,这里略过。以 α=2\alpha=2 为例,利用 Cohen2001 的 22-近似最短路,22- 近似 MCB 的时间复杂度为 O(m1.5n1.5+mω)O(m^{1.5}n^{1.5}+m^\omega)

验证环基:直接套用分治做法计算 SiS_i 可以验证 {C1,C2,,CN}\{C_1,C_2,\dots,C_N\} 是否是环基,复杂度为 O(mω)O(m^\omega)

Mehlhorn 2007:加速找环

在 Pina 1995 和 Kavitha 2004 的基础上,优化了根据 SiS_iCiC_i 的步骤,提出了复杂度为 O(m2n/logn+n2m)O(m^2n / \log n+n^2m) 的无向图带权 MCB 做法,注意分治求 SiS_i 的部分还在,但是 O(mω)O(m^\omega) 可以视为被 O(m2n/logn)O(m^2n/\log n) 覆盖。

优化备选环集:Horton 1984 提出了一种大小为 O(nm)O(nm) 的备选环集,即枚举任意点和任意边,用它们之间的最短路径构造环,记为 C[w,e]C[w,e]。本文分别从点和边的角度优化了备选环集的大小(并没有实质性地降低复杂度):

  • 从点的角度来说:我们只需考虑所有被环覆盖的点的点集,即 Z={C1C2}Z=\{C_1 \cup C_2 \cup \dots\}。最坏情况下 Z=VZ=V。准确地求 ZZ 是一件很难的事情,不过 Bafna1999 给出了一种无向图 22-近似的 ZZ' 集合求法。
  • 从边的角度来说:当枚举的点是 zZz \in Z 时,设 TzT_{z} 是以 zz 为根的最短路径树,我们只需枚举所有满足下列要求的非树边 (u,v)(u,v) 来构造环集:uuvvTzT_z 上的最近公共祖先等于 zz。证明比较复杂,这里略过了。

优化找环算法:构造上述备选环集后,把这些环按边权从小到大排序,复杂度是 O(nmlogn)O(nm \log n)。在第 ii 步时,我们希望在有序的环数组中找到最靠前的 CiC_i 使得 Si,Ci=1\langle S_i,C_i\rangle=1

  1. 枚举所有点 zZz \in Z,在 TzT_z 上计算出从根 zz 到每个节点的前缀内积,即预处理 lz(x)=Si,Path(z,x)l_z(x)=\langle S_i,Path(z,x) \rangle,其中 Path(z,w)Path(z,w) 表示 zwz \sim w 树上路径构成的点集。这一步预处理的复杂度是 O(nZ)=O(n2)O(n|Z|)=O(n^2)
  2. 按顺序枚举每一个环 C[z,e=(u,v)]C[z,e=(u,v)],利用 lz(u)lz(v)[eSi]l_z(u) \oplus l_z(v) \oplus [e \in S_i]O(1)O(1) 计算出这个环和 SiS_i 的内积。这一步枚举的复杂度是 O(mZ)=O(nm)O(m|Z|)=O(nm)

上述过程总共持续 mn+1m-n+1 步,所以总复杂度为 O(m2n+mω)O(m^2n+m^\omega),比 Pina 1995 的做法更快更简单。

进一步优化:利用 bitset 的思想能进一步优化上述过程 。在第 ii 步时:

  1. 同样花 O(nZ)O(n|Z|) 预处理出 Tz(x)T_z(x),维护 nn 个 01 向量 HiH_i 满足 Hx={Tz(x)zZ}H_x=\{T_z(x)|z \in Z\}
  2. 对于每条边 e=(u,v)e=(u,v),把待选点集 zZz \in Z 按每 2b2^b 个分块。假设某块的点集是 BB,枚举所有的 ABA \subseteq B 并记录 ie,B(A)=x,xA  w(C[x,e])=min({w(C[z,e])zA})i_{e,B}(A)=x,x \in A~\wedge~w(C[x,e])=\min(\{w(C[z,e])|z \in A\})。预处理复杂度 O(mn2b)O(mn2^b)
  3. 枚举每条边 e=(u,v)e=(u,v),计算 L=HuHvOL=H_u \oplus H_v \oplus O,其中 OO 表示全 1 或全 0 向量,取决于 {e},Si\langle \{e\},S_i \rangle 的值。对于每一个待选点集块 BB,假设 LL 在这块上的答案是 LBL_B,说明所有 zLBz \in L_B 的点 zz 能使 C[z,e],Si=1\langle C[z,e], S_i \rangle=1。此时我们利用之前预处理的 ie,B(LB)i_{e,B}(L_B) 来快速定位环长最小的环。整体的扫描复杂度 O(nm/b)O(nm/b)

综上,总复杂度 O(nm2b+m(n2+nm/b)+mω)O(nm2^b+m(n^2+nm/b)+m^\omega),取 b=12lognb=\frac{1}{2} \log n 时复杂度为 O(m2n/logn+mn2)O(m^2n / \log n+mn^2)

Amaldi 2009:蒙特卡洛

论文标题很霸气,叫做 Breaking the O(m2n)O(m^2n) Barrier for Minimum Cycle Bases。Kavitha 2004 把维护支持向量的复杂度降低为 O(mω)O(m^\omega),而本文优化了找边权最小的 Ci,Si=1\langle C_i,S_i \rangle=1 的部分,总复杂度是非确定性的 O(mω)O(m^\omega)

推广:内积、正交等逻辑可以从 GF(2)GF(2) 推广成 GF(p)GF(p)pp 是一个素数)。维护支持向量的公式推广为:

Sj=SjCi,SjCi,SiSiS_j=S_j-\frac{\langle C_i,S_j \rangle}{\langle C_i,S_i \rangle}S_i

无向图最小环基取 p=2p=2,有向图取 p=O(m)p=O(m),所以 GF(p)GF(p) 上的加减乘除运算都视为 O(1)O(1)

环集快速判定问题:对于一个环 CC,我们可以 O(m)O(m) 计算出它是否和目标向量 SiS_i 正交(C,Si=0\langle C,S_i \rangle=0)。那么对于一个环的集合 GG,能否以低于 O(Gm)O(|G|m) 的复杂度,快速判定是否集合里的所有环都和目标向量 SiS_i 正交。

环集快速判定算法:对环集 GG 里的每个环 CC,取固定系数 λCGF(p)\lambda_C \in GF(p),那么我们可以求出环集 GG 的“代表向量” RG=CGλCCR_G=\sum_{C \in G} \lambda_CC。当 C,Si0\langle C,S_i \rangle \ne 0 时,必然存在 CGC \in G 使得 CCSiS_i 不正交;反之,我们声明环集内的所有环都和 SiS_i 正交,错误概率是 P(err)=1/pP(err)=1/p。若 λC\lambda_C 重复取 kk 组,出错概率降低到 P(err)=pkP(err)=p^{-k}

找最小环算法:将 O(nm)O(nm) 个备选环按边权大小构建一颗二叉平衡树,深度 O(lognm)=O(logn)O(\log nm)=O(\log n)。对于树上的每一个环 CC,我们都随机 kkλC\lambda_C,预处理它的整个子树环集里的代表向量(总共也有 kk 组)。每当我们想找边权和最小的 CiC_i 使得 Ci,Si=1\langle C_i,S_i \rangle=1 时,从平衡树的根节点出发,每次询问左儿子的环集里是否所有环都和 SiS_i 正交,如果不是则往左走(这一步不会出错),如果是则往右走(这一步有 pkp^{-k} 的概率出错),走完树高即能贪心地确认本次的 CiC_i。总共有 O(m)O(m) 个需要确认,总决策数 O(mlogn)O(m \log n),错误概率 P(err)=mlognmpkP(err)=m \log nm \cdot p^{-k}。每次决策都要重复计算 kk 次,每次耗时 O(m)O(m),所以找最小环算法的总复杂度是 O(km2logn)O(km^2\log n)

笔者注:错误概率应以指数体现,可能作者默认 pkp^{-k} 很小小,所以 (1pk)mlogn(1-p^{-k})^{m \log n}mlognpkm \log n \cdot p^{-k} 近似。

总结:利用上述蒙特卡洛随机算法,总时间复杂度为 O(nm+n2logn+mω+km2logn)O(nm+n^2\log n+m^\omega+km^2\log n),简化为 O(mω)O(m^\omega)。错误概率 P(err)=mlog(nm)pkP(err)=m \log (nm)p^{-k}mm 足够大时取 k=m0.1k=m^{0.1},错误概率可以忽略不计。

Rathod 2021 更简洁的非确定性做法

本文同时做了 Minimum Cycle Basis 和 Minimum Homology Basis,前者给出了一个 O~(mω)\tilde{O}(m^\omega) 的做法。

利用 Pina 1995 的分析结论,对 O(nm)O(nm) 个备选环按边权和从小到大排序,并构成一个 m×nm \times n 的矩阵 AA,显然该矩阵的秩为 r=mn+1r=m-n+1。现在定义 colomn(row) rank profile 为:字典序最小的列(行)下标 [i1,i2,,ir][i_1,i_2,\dots,i_r] 使得这些列(行)线性无关。可以用反证法证明:[Ai1,Ai2,,Air][A_{i_1},A_{i_2},\dots,A_{i_r}] 即为一组最小环基。

高斯消元求 rank profileO(nmr)O(nmr) 的,而已知复杂度最低的确定性做法是 O(mnrω2)O(mnr^{\omega-2}) 的。

Cheung 2013 提出了一个突破性的蒙特卡洛算法(但求出的列不是字典序最小的),复杂度记为:

O(nnz(A)+rω)1+o(1)=O~(nnz(A)+rω)O(nnz(A)+r^\omega)^{1+o(1)}=\tilde{O}(nnz(A)+r^\omega)

其中 o(1)o(1) 表示一些 logn\log nlogm\log m 的系数,nnz(A)nnz(A) 表示矩阵的非零元素个数,O~\tilde{O} 表示忽略一些多项式小因子。

Storjohann 和 Yang 在 2014 年以同样的 O~(nnz(A)+rω)\tilde{O}(nnz(A)+r^\omega) 复杂度求出了 rank profile,错误概率 1/21/2

利用上述研究成果,对备选环排序、构建矩阵、求 rank profile 后,即可在 O~(mω)\tilde{O}(m^\omega) 的时间内求出最小环基。