qoj#11723 I've Got Friends
题目大意
有
现在给定
设
解题过程
将每个人看作连接
下面探讨
定理 1:图
H 是线图,当且仅当存在一系列子图C_1,C_2,\dots,C_k ,其中每个C_i 都是完全图,且H 中每条边恰好在一个子图中,每个点在不超过两个子图中。称这一系列子图为一组“划分”,其中每个子图为一个“单元”。
这个定理很容易证明,线图划分中每个单元就对应了原图中与一个顶点相连的所有边,如果得到了划分那么构造出原图是容易的。这个定理在下面的证明和算法中非常重要,现在算法的目的就变成找到一组划分。
为了便于表述,下面记
在关于线图的研究中,有一种重要的结构是”三角形“(三元环),即三个点
下面的引理就可以体现三角形和其奇偶性的作用:
引理 1:在线图
H 的划分中,设边(a,b) 所在单元为C ,那么所有满足(a,b,c) 为奇三角形的c 都满足c\in C 。
证明考虑反证:假设存在
- 若
d 只与a 相邻(b 同理),那么显然d\notin C 。又因为d\nsim c ,所以(a,d),(a,c) 属于两个不同单元且都不是C ,那么a 出现在三个单元中,矛盾; - 若
d 只与c 相邻,那么(c,a),(c,b),(c,d) 必须属于三个不同单元,矛盾; - 若
d 与a,b,c 都相邻且d\in C ,那么同上(c,a),(c,b),(c,d) 属于三个不同单元,矛盾; - 若
d 与a,b,c 都相邻且d\notin C ,那么(a,c),(a,d) 必须在同一单元C^{\prime} 中。由于(a,b) 已经在C 中所以b\notin C^{\prime} 。那么(b,c),(b,d) 必须在两个不同单元中且都不是C ,矛盾。
引理 2:如果图
H 是线图,那么:(a) 图
H 不存在与K_{3,1} (即左部3 个点、右部1 个点的完全二分图,或者说4 个点的”菊花图“)同构的子图;(b) 如果图
H 中存在两个共边的奇三角形(a,b,c),(a,b,d) ,那么c\sim d ,即\{a,b,c,d\} 的导出子图为K_4 。
(a) 的证明较为容易(其实这个思路在引理 1 的证明中已经出现)。假设存在
(b) 容易由引理 1 得出。
事实上,这两个条件不仅是必要的,也是
考虑完共边奇三角形,再来看共边偶三角形:
定理 2:如果线图
H 中有两个共边的偶三角形(a,b,c),(a,b,d) ,那么H 在同构意义下只有三种可能(记为H_1,H_2,H_3 )。即如果线图H 不同构于H_1,H_2,H_3 ,那么H 中任意两个共边三角形中至少一个是奇的。
容易验证
当图中只有
注意到如果
所以可以用程序枚举所有不超过
引理 3:在线图
H 的划分中,设边(a,b) 所在单元为C ,包含边(a,b) 的三角形为(a,b,c_1),(a,b,c_2),\dots,(a,b,c_k) ,那么c_1,c_2,\dots,c_k 中至少有k-1 个在C 中。
证明类似引理 1,考虑反证:假设
引理 4:如果图
H 中的一个三角形在一个同构于K_r(r\geq 4) 的导出子图中,那么这个三角形是奇的。
正确性显然。
下面的定理为本文的算法提供了重要的思路和理论支撑:
定理 3:设线图
H (不是H_1,H_2,H_3 )中边(a,b) 共在k(k\geq 2) 个三角形中,其中有l 个奇三角形(a,b,c_1),(a,b,c_2),\dots,(a,b,c_l) ,那么有:(a)
l=k-1 或l=k ;(b)
\{a,b,c_1,c_2,\dots,c_l\} 的导出子图一定是H 的划分中的一个单元。
(a) 由定理 2 容易证明。
(b) 是引理 1 的扩展,由引理 1 知
下面描述了判断
- 任取
H 中一条边(a,b) 统计其所在的三角形数量,设为k :- 若
k=0 ,则(a,b) 一定为一个同构于K_2 的单元,转到步骤 3; - 若
k=1 ,设该三角形为(a,b,c) 。统计(a,c),(b,c) 所在三角形数量若均为1 ,则容易说明此时H 如果不是K_3 ,则三角形(a,b,c) 一定一个单元,转到步骤 3。若(a,c) 在不小于2 个三角形中,则用(a,c) 代替(a,b) 转到步骤 2,(b,c) 同理; - 若
k\geq 2 ,转到步骤 2。
- 若
- 统计
k 个三角形中奇三角形个数,设为l ,那么:- 如果
k = 2,l=0 ,此时H 可能为H_1,H_2,H_3 或者不是线图,将其中任意三角形作为起始单元转到步骤 3(容易验证对于这三种图这样都能正确构造); - 否则如果
l<k-1 ,由定理 3,H 不为线图; - 如果
l=k 或l=k-1 ,那么由定理 3 也找到了一个单元,判断这个导出子图是否是完全图,转到步骤 3。
- 如果
- 现在已经找到了划分中的一个单元
C_1 ,那么由于每个点至多在两个单元中,所以C_1 中每个点x 如果有不在C_1 中的边(x,y_1),(x,y_2),\dots,(x,y_s) ,那么\{x,y_1,y_2,\dots,y_s\} 的导出子图一定是一个单元。一直这样递归下去,如果出现导出子图不是完全图或一个点出现在三个单元中,则H 不是线图。否则由H 连通,必然会将得到一个合法的划分。 - 得到划分后,为每个单元在
G 中建一个点,并将这个点作为单元中每个点在G 中对应的边的一个端点。如果一个H 中的点只在一个划分中,则将G 中对应边的另一个端点设为一个仅与这条边相邻的新点。
步骤 1,2 精细实现可以做到
至此得到了一个
最后,对于
总复杂度
参考资料
- van Rooij, A. C. M., & Wilf, H. S. 1965. "The interchange graph of a finite graph". Acta Mathematica, 16(3-4), 263–268.
- Roussopoulos, Nicholas D. 1973. "A max {m,n} Algorithm for Determining the Graph H from Its Line Graph G." Information Processing Letters 2 (4): 108-112.