最小环基(Minimal Cycle Basis,中文翻译是我随便取的)是图论的一个具体的研究问题。借着华为 Hackathon 2023 的机会,我决定对学界的 Minimal Cycle Basis 问题做一次系统性地调研。
概念和记号表示
考虑不存在重边、自环的无向/有向图 G=(V,E),点没有权重,边可以有权重。
记号 |
含义 |
n,m |
图 G 中的点数和边数,即 $n= |
x,y |
图 G 中的某两个顶点,即 x,y∈V |
e |
图 G 中的某条边,即 e∈E |
P(x,y) |
从 x 到 y 的某条最短路径的边集 |
B |
G 的某一个环基 |
C |
G 的某一个环 |
T |
G 的某一个生成树 |
Tx |
G 中以 x 为根的最短路径树 |
环:环是一个边的子集,满足导出子图连通且每个点的度数都是偶数。简单环 额外要求每个点的度数都是 2。
环的和:对于两个环 C1,C2,定义它们的 和 为这两个集合的对称差,即 Csum=(C1∪C2)−(C1∩C2),简记为 Csum=C1+C2。容易发现,两个环的和一定是空集、一个合法的环或两个不相交的环。
环的向量表示:我们可以用一个长度为 ∣V∣ 的 01 向量 v 表示一个简单环,vi=1 当且仅当环中包含点 i。那么两个环的和的向量表示是 vsum=v1⊕v2。
环空间:对于环集 D0={C1,C2,…,Cl},设环集序列 Di={Ci+Cj∣Ci,Cj∈Di−1},称 D+∞ 为环集 C 导出的环空间。显然有 D+∞={k1C1+k2C2+⋯+klCl},其中 ki={0,1}。
环基:环空间覆盖了图上所有环的环集成为环基。环基里每一个环的向量都是线性无关的,而且它们能线性表出整个环空间。设 B 是一组环基,则有 ∣B∣=m−n+1。边权和最小的环基即为 最小环基。
Horton 1984:第一个多项式做法
对于边可以带权的 无向图,提出了 MCB 的第一个多项式做法,复杂度为 O(m3n)。
定理 0:若 C∈B 且 C=C1+C2,那么环集 (B−C)∪C1 和环集 (B−C)∪C2 一定有一个是环基。
定理 1:环基中一定存在一个环 C 满足 C 是最小环。
定理 2:若 C∈B 且 x,y∈C,那么 P(x,y)⊆C。
定理 3:若 C∈B,对于任何 x∈C,存在 e=(y,z) 使得 C=P(x,y)∪P(x,z)∪{e}。
定理 4:若 e=(x,y),包含 e 的最小环 Ce 满足 Ce 在某一个合法环基里。
基本算法:按下列步骤可以求得一个 G 的环基:
- 对于所有点对 (x,y),计算 P(x,y)。
- 枚举所有点边对 v,(x,y),创建环 C(v,x,y)=P(v,x)∪P(v,y)∪{(x,y)}。
- 按边权和从大到小枚举每一个环,能选就选。用高斯消元来判定。
复杂度分析:第 2 步会构造出 O(nm) 个环。每个环用向量表示,构成了 O(nm)×m 的矩阵。第 3 步里从前往后枚举每一行,如果不是全零就选上,然后向后做一遍消元。不妨设环基的元素个数是 d=m−n+1,总共会消元 O(nm)×d 次,单次消元涉及 m 列,所以总复杂度为 O(dm2n)=O(m3n)。
加速:第 2 步生成环 C={x1,x2,…,xk} 后,可以花 O(k) 的时间利用定理 3 来检查这个环是否值得被尝试。具体来说,设 ri(1≤i≤k) 为 xi 向右最远衍生到的环上的点使得 P(xi,ri)={xi,xi+1,…,ri},同理 li 是向左最远衍生的环点。当前环能在最小环基中的必要条件:对于任何 1≤i≤k,(li,ri) 是相邻的。利用这个性质可以对环进行提早剪枝,但作者并不会证明是否能降低复杂度。注意这个条件并不充分,存在相应的反例。
Pina 1995:基于代数图论
对于边可以带权的 无向图,提出了一个 O(m3+m2nlogn) 的基于代数图论的做法。
代数表示:任取 G 的一棵生成树 T,EG\T 是 G 的非树边集合,不妨设 N=∣EG\T∣。对于图中任意一个环 C,可以用 {0,1}N 空间下的向量 v 来表示:1 表示包含这条非树边而 0 表示不包含。
内积:定义 ⟨u,v⟩ 为两个环向量在 GF(2) 下的内积。⟨u,v⟩=1 当且仅当环 u 和环 v 有奇数条公共边。
支持向量:环集 {C1,C2,…,Ci−1} 的支持向量 Si 满足:Si 非平凡(Si=0)且 Si 与所有 Cj 正交。
总体算法:假设当前已找到环基的前 i−1 个环 {C1,C2,…,Ci−1},求出它们的任一支持向量 Si:
⟨Ck,Si⟩=0,k=1,2,…,i−1
在图中找到一个边权和最小的环 Ci 使得 ⟨Ci,Si⟩=1,将其加入集合。重复操作直到加入 m−n+1 个环。
找正交环:把图中所有点 v∈V 拆成 (v0,v1) 左右两个点,构造新图。枚举 e=(u,v)∈G\T,如果 e∈Si 就连接 (u0,v1) 和 (u1,v0) 两条边,否则连接 (u0,v0) 和 (u1,v1) 两条边。断言:新图中从任意 v0 出发抵达 v1 的路径,正好对应原图中包含 v 且与 Si 正交的环。需要对枚举所有 (v0,v1) 找出最短路径,这是多源最短路。
维护支持向量:初始时设 Si={ei}(1≤i≤N),这样所有支持向量彼此之间正交。增加 Ci 后更新 Sj:
Sj′={SjSj+Si⟨Ci,Sj⟩=0⟨Ci,Sj⟩=1i+1≤j≤N
更新完后能保证 Si+1′,Si+2′,…,SN 是完全正交于 C1,C2,…,Ci 的子空间。
复杂度分析:每一步求 Ci 的复杂度是多源最短路,需要跑 n 遍堆优化的 Dijkstra,复杂度 O(nmlogn);每一步更新 Si+1,Si+2,…,SN 的复杂度是 O(m2)。重复 m−n+1 次,总复杂度为 O(m3+mn2logn)。
Kavitha 2004:分治加速支持向量
在 Pina 1995 的基础上,优化了求支持向量的部分,提出了复杂度为 O(mω+m2n+mn2logn) 的分治做法。当多源最短路退化时:整数边权的复杂度降低至 O(m2n),而边不带权的复杂度进一步降低至 O(mω)。
分治:设 F({C1,C2,…,Ci},{Si+1,Si+2,…,Si+k},k) 表示在前 i 个环已经形成,{Si+1,Si+2,…,Si+k} 这些支持向量已正交于前 i 个环,在此基础上求出 {Ci+1,Ci+2,…,Ci+k} 这些环。
- 最外层调用 F(∅,{ {e1},{e2},…,{eN} },N) 即为答案。
- 若 k=1,此时 Si+1 一定已维护准确。重复找正交环的过程求出满足 ⟨Ci+1,Si+1⟩ 的 Ci+1 即可。
- 若 k>1,那么将 {Si+1,Si+2,…,Si+k} 拆成两半 {Si+1,Si+2,…,Si+mid} 和 {Si+mid+1,…,Si+k}。
- 调 F({C1,C2,…,Ci},{Si+1,Si+2,…,Si+mid},mid) 求出前 mid 个环和支持向量。不妨设更新后的支持向量为 {Ti+1,Ti+2,…,Ti+mid}。显然 {Ti+1,Ti+2,…,Ti+mid} 都正交于 {C1,C2,…,Ci}。
- 利用 {C1,C2,…,Ci} 和 {Ti+1,Ti+2,…,Ti+mid} 去更新后半段的 {Si+mid+1,…,Si+k}。
- 调 F({C1,C2,…,Ci},{Ti+mid+1,Ti+mid+2,…,Ti+k},k−mid) 求出后 k−mid 个环和支持向量。
考虑 k>1 的第 2 步。我们希望更新 {Si+mid+1,…,Si+k} 使其能正交于 {Ci+1,Ci+2,…,Ci+mid}。构造:
Tj=Sj+aj,1Ti+1+aj,2Ti+2+⋯+aj,midTi+midmid<j≤k
注意到 Sj 和 {Ti+1,Ti+2,…,Ti+mid} 本都正交于 {C1,C2,…,Ci},所以 Tj 一定与之正交。我们有 mid 个自由系数 {aj,1,…,aj,mid} 可以确定,想要使 Tj 正交于 mid 个新环 {Ci+1,Ci+2,…,Ci+mid},这是能办到的。
AX+Y=0,X=⎩⎨⎧⟨Ti+1,Ci+1⟩ …⟨Ti+2,Ci+2⟩ ……⟨Ti+mid,Ci+2⟩ … ⟨Ti+1,Ci+mid⟩ ⟨Ti+2,Ci+mid⟩ ⟨Ti+mid,Ci+mid⟩⎭⎬⎫,Y=⎩⎨⎧⟨Ti+mid+1,Ci+1⟩ ……⟨Ti+k,Ci+2⟩ … ⟨Ti+mid+1,Ci+mid⟩ ⟨Ti+k,Ci+mid⟩⎭⎬⎫
注意 X 是上三角矩阵(左下块全 0),即 X 一定可逆。系数矩阵 A=YX−1。
分治复杂度分析:根据主定理,下列分治式子的综合复杂度为 O(m2n+mn2logn)。
X={mn+n2logn2T(k/2)+O(kω−1m)k=1k>1
α−近似算法:在每一轮找 ⟨Si,Ci⟩ 的最小环时 ,如果找到的环 Di 满足 w(Di)≤α⋅w(Ci),那么所得的环基 {D1,D2,…,DN} 的一定也满足 ∑w(Di)≤α⋅MCB。证明比较复杂,这里略过。以 α=2 为例,利用 Cohen2001 的 2−近似最短路,2− 近似 MCB 的时间复杂度为 O(m1.5n1.5+mω)。
验证环基:直接套用分治做法计算 Si 可以验证 {C1,C2,…,CN} 是否是环基,复杂度为 O(mω)。
Mehlhorn 2007:加速找环
在 Pina 1995 和 Kavitha 2004 的基础上,优化了根据 Si 找 Ci 的步骤,提出了复杂度为 O(m2n/logn+n2m) 的无向图带权 MCB 做法,注意分治求 Si 的部分还在,但是 O(mω) 可以视为被 O(m2n/logn) 覆盖。
优化备选环集:Horton 1984 提出了一种大小为 O(nm) 的备选环集,即枚举任意点和任意边,用它们之间的最短路径构造环,记为 C[w,e]。本文分别从点和边的角度优化了备选环集的大小(并没有实质性地降低复杂度):
- 从点的角度来说:我们只需考虑所有被环覆盖的点的点集,即 Z={C1∪C2∪…}。最坏情况下 Z=V。准确地求 Z 是一件很难的事情,不过 Bafna1999 给出了一种无向图 2−近似的 Z′ 集合求法。
- 从边的角度来说:当枚举的点是 z∈Z 时,设 Tz 是以 z 为根的最短路径树,我们只需枚举所有满足下列要求的非树边 (u,v) 来构造环集:u 和 v 在 Tz 上的最近公共祖先等于 z。证明比较复杂,这里略过了。
优化找环算法:构造上述备选环集后,把这些环按边权从小到大排序,复杂度是 O(nmlogn)。在第 i 步时,我们希望在有序的环数组中找到最靠前的 Ci 使得 ⟨Si,Ci⟩=1。
- 枚举所有点 z∈Z,在 Tz 上计算出从根 z 到每个节点的前缀内积,即预处理 lz(x)=⟨Si,Path(z,x)⟩,其中 Path(z,w) 表示 z∼w 树上路径构成的点集。这一步预处理的复杂度是 O(n∣Z∣)=O(n2)。
- 按顺序枚举每一个环 C[z,e=(u,v)],利用 lz(u)⊕lz(v)⊕[e∈Si] 来 O(1) 计算出这个环和 Si 的内积。这一步枚举的复杂度是 O(m∣Z∣)=O(nm)。
上述过程总共持续 m−n+1 步,所以总复杂度为 O(m2n+mω),比 Pina 1995 的做法更快更简单。
进一步优化:利用 bitset 的思想能进一步优化上述过程 。在第 i 步时:
- 同样花 O(n∣Z∣) 预处理出 Tz(x),维护 n 个 01 向量 Hi 满足 Hx={Tz(x)∣z∈Z}。
- 对于每条边 e=(u,v),把待选点集 z∈Z 按每 2b 个分块。假设某块的点集是 B,枚举所有的 A⊆B 并记录 ie,B(A)=x,x∈A ∧ w(C[x,e])=min({w(C[z,e])∣z∈A})。预处理复杂度 O(mn2b)。
- 枚举每条边 e=(u,v),计算 L=Hu⊕Hv⊕O,其中 O 表示全 1 或全 0 向量,取决于 ⟨{e},Si⟩ 的值。对于每一个待选点集块 B,假设 L 在这块上的答案是 LB,说明所有 z∈LB 的点 z 能使 ⟨C[z,e],Si⟩=1。此时我们利用之前预处理的 ie,B(LB) 来快速定位环长最小的环。整体的扫描复杂度 O(nm/b)。
综上,总复杂度 O(nm2b+m(n2+nm/b)+mω),取 b=21logn 时复杂度为 O(m2n/logn+mn2)。
Amaldi 2009:蒙特卡洛
论文标题很霸气,叫做 Breaking the O(m2n) Barrier for Minimum Cycle Bases。Kavitha 2004 把维护支持向量的复杂度降低为 O(mω),而本文优化了找边权最小的 ⟨Ci,Si⟩=1 的部分,总复杂度是非确定性的 O(mω)。
推广:内积、正交等逻辑可以从 GF(2) 推广成 GF(p)(p 是一个素数)。维护支持向量的公式推广为:
Sj=Sj−⟨Ci,Si⟩⟨Ci,Sj⟩Si
无向图最小环基取 p=2,有向图取 p=O(m),所以 GF(p) 上的加减乘除运算都视为 O(1)。
环集快速判定问题:对于一个环 C,我们可以 O(m) 计算出它是否和目标向量 Si 正交(⟨C,Si⟩=0)。那么对于一个环的集合 G,能否以低于 O(∣G∣m) 的复杂度,快速判定是否集合里的所有环都和目标向量 Si 正交。
环集快速判定算法:对环集 G 里的每个环 C,取固定系数 λC∈GF(p),那么我们可以求出环集 G 的“代表向量” RG=∑C∈GλCC。当 ⟨C,Si⟩=0 时,必然存在 C∈G 使得 C 和 Si 不正交;反之,我们声明环集内的所有环都和 Si 正交,错误概率是 P(err)=1/p。若 λC 重复取 k 组,出错概率降低到 P(err)=p−k。
找最小环算法:将 O(nm) 个备选环按边权大小构建一颗二叉平衡树,深度 O(lognm)=O(logn)。对于树上的每一个环 C,我们都随机 k 组 λC,预处理它的整个子树环集里的代表向量(总共也有 k 组)。每当我们想找边权和最小的 Ci 使得 ⟨Ci,Si⟩=1 时,从平衡树的根节点出发,每次询问左儿子的环集里是否所有环都和 Si 正交,如果不是则往左走(这一步不会出错),如果是则往右走(这一步有 p−k 的概率出错),走完树高即能贪心地确认本次的 Ci。总共有 O(m) 个需要确认,总决策数 O(mlogn),错误概率 P(err)=mlognm⋅p−k。每次决策都要重复计算 k 次,每次耗时 O(m),所以找最小环算法的总复杂度是 O(km2logn)。
笔者注:错误概率应以指数体现,可能作者默认 p−k 很小小,所以 (1−p−k)mlogn 用 mlogn⋅p−k 近似。
总结:利用上述蒙特卡洛随机算法,总时间复杂度为 O(nm+n2logn+mω+km2logn),简化为 O(mω)。错误概率 P(err)=mlog(nm)p−k,m 足够大时取 k=m0.1,错误概率可以忽略不计。
Rathod 2021 更简洁的非确定性做法
本文同时做了 Minimum Cycle Basis 和 Minimum Homology Basis,前者给出了一个 O~(mω) 的做法。
利用 Pina 1995 的分析结论,对 O(nm) 个备选环按边权和从小到大排序,并构成一个 m×n 的矩阵 A,显然该矩阵的秩为 r=m−n+1。现在定义 colomn(row) rank profile 为:字典序最小的列(行)下标 [i1,i2,…,ir] 使得这些列(行)线性无关。可以用反证法证明:[Ai1,Ai2,…,Air] 即为一组最小环基。
高斯消元求 rank profile 是 O(nmr) 的,而已知复杂度最低的确定性做法是 O(mnrω−2) 的。
Cheung 2013 提出了一个突破性的蒙特卡洛算法(但求出的列不是字典序最小的),复杂度记为:
O(nnz(A)+rω)1+o(1)=O~(nnz(A)+rω)
其中 o(1) 表示一些 logn 和 logm 的系数,nnz(A) 表示矩阵的非零元素个数,O~ 表示忽略一些多项式小因子。
Storjohann 和 Yang 在 2014 年以同样的 O~(nnz(A)+rω) 复杂度求出了 rank profile,错误概率 1/2。
利用上述研究成果,对备选环排序、构建矩阵、求 rank profile 后,即可在 O~(mω) 的时间内求出最小环基。