Havel–Hakimi 算法与 Erdos-Gallai 定理

· · 科技·工程

本文内容由 MO 佬孔明七星在水群时科普并讲解。

他和他的同学分别独自发现一个人名定理,必须狠狠拜谢。

Havel–Hakimi 算法用于判定序列是否可简单图化并给出方案。

简单图化指构造简单无向图,使 n 个点的度数与序列元素一一对应。

算法流程:

下面证明算法正确性。

假设存在边集 E 使得排序后序列 d_1 对应点 V_1 的连边方案不为如上,则 \exists i,j,i\le d_1+1<j(V_1,V_i)\notin E,(V_1,V_j)\in E

k 使得 (V_k,V_i)\in E,(V_k,V_j)\notin E,则可以交换边 (V_1,V_j),(V_i,V_k)(V_1,V_i),(V_j,V_k) 的存在性,则归约到如上方案。

若不存在这样的 k,即 \forall u,(V_u,V_i)\in E(V_u,V_j)\in E,又 (V_1,V_i)\notin E,(V_1,V_j)\in E,则 d_i<d_j,与题设矛盾。

上面证得若问题存在解则算法必能找到解,其逆否命题即为算法报告无解时问题必无解。

使用归并排序或计数排序,时间复杂度可以做到 \mathcal O(n^2)

若仅需判断是否有解或图稀疏,由于每次变化量仅有 1,可以用 FHQ-treap 维护序列模拟该算法达到 \mathcal O(n\log n) 的复杂度(感谢佬zhjxaoini补充)。

Erdos-Gallai 定理仅对该问题做出判定而不构造方案。它断言有序列可简单图化当且仅当序列从大到小排序后满足:

第一条的必要性是显然的,对于第二条的必要性,我们考虑作为解的简单图中度数前 i 大的点,一方面它们的度数和为 \sum\limits_{j=1}^id_j,另一方面考虑它们度数和的上界,这些点之间两两连边的贡献最大为 i(i-1),而对于其他点即 \forall j>i,每个点能产生的贡献最大为 \min(i,d_j),故可推出第二条式子成立,即必要性得证。

接下来证明充分性。记 s=\sum\limits_{i=1}^nd_i,当 s=0 时显然成立。于是考虑数学归纳法,证明当 s=2k 命题成立时 s=2(k+1) 命题仍成立。

不妨删去序列末尾的 0,显然这对证明没有影响。设有满足 s=2(k+1) 的序列 d 满足如上式子,记最小的 p 满足 d_p>d_{p+1},若不存在则记 p=n-1,并令 d_p\gets d_p-1,d_n\gets d_n-1,这可以视作连边 (j,n),记得到的新序列为 d'。显然 d' 仍是有序的且满足第一条,下面证明 d' 满足第二条。

i=n 时,式子显然成立。当 p\le i<n 时,式子左端减少 1,右端仅在和号中的 j=n 时减少至多 1,故仍成立。

i<p 时,我们需要再对 d_i 的值进行分类讨论,实际上由于 p 的定义,这个值与所有 d_{1\cdots p} 都相等:

第二条式子通过维护 \min 号取值的分界,即在循环 i 时记录最小的 j 满足 d_j<i,可以做到判断复杂度 \mathcal O(n)。由于显然值域与点数同阶,用计数排序即可做到 \mathcal O(n) 判断序列是否可简单图化。依照对充分性的证明也可以实现构造方案,但复杂度达到 \mathcal O(nm) 一般更劣。