专栏文章
qoj#11723 I've Got Friends
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minjufjg
- 此快照首次捕获于
- 2025/12/02 03:35 3 个月前
- 此快照最后确认于
- 2025/12/02 03:35 3 个月前
题目大意
有 个人,每个人 有两种喜爱食物 。定义这 个人的友谊集合为 。
现在给定 和 ,要求构造一组 ,使得这 个人的友谊集合为给出的 ,或报告无解。
设 ,则 , 中每个二元组均由 内的两个不同正整数构成,且没有两个相同的二元组。
解题过程
将每个人看作连接 的边,那么 就是所有有公共端点的边对。则原题转化为求出一个 条边的多重图(即允许重边的图),使得其线图 (line graph) 为给定的图 , 即为 的边集。
下面探讨 不存在重边并且连通的情况(连通块之间显然没有影响),最后会说明存在重边的情况只需简单处理。内容参考了 Van Rooij 和 Wilf 发表于 1965 年的论文以及 Roussopoulos 发表于 1973 年的论文(见参考资料)。
定理 1:图 是线图,当且仅当存在一系列子图 ,其中每个 都是完全图,且 中每条边恰好在一个子图中,每个点在不超过两个子图中。称这一系列子图为一组“划分”,其中每个子图为一个“单元”。
这个定理很容易证明,线图划分中每个单元就对应了原图中与一个顶点相连的所有边,如果得到了划分那么构造出原图是容易的。这个定理在下面的证明和算法中非常重要,现在算法的目的就变成找到一组划分。
为了便于表述,下面记 表示点 和点 之间存在边, 表示 和 之间不存在边。
在关于线图的研究中,有一种重要的结构是”三角形“(三元环),即三个点 满足 。同样重要的还有三角形的奇偶性:定义一个三角形 是奇的,当且仅当图中存在一个点 ,恰好与 中 个或 个点相邻;否则这个三角形是偶的。
下面的引理就可以体现三角形和其奇偶性的作用:
引理 1:在线图 的划分中,设边 所在单元为 ,那么所有满足 为奇三角形的 都满足 。
证明考虑反证:假设存在 使得 为奇三角形,那么存在另一点 恰好与 中的一个或者三个点相邻。
- 若 只与 相邻( 同理),那么显然 。又因为 ,所以 属于两个不同单元且都不是 ,那么 出现在三个单元中,矛盾;
- 若 只与 相邻,那么 必须属于三个不同单元,矛盾;
- 若 与 都相邻且 ,那么同上 属于三个不同单元,矛盾;
- 若 与 都相邻且 ,那么 必须在同一单元 中。由于 已经在 中所以 。那么 必须在两个不同单元中且都不是 ,矛盾。
引理 2:如果图 是线图,那么:(a) 图 不存在与 (即左部 个点、右部 个点的完全二分图,或者说 个点的”菊花图“)同构的子图;(b) 如果图 中存在两个共边的奇三角形 ,那么 ,即 的导出子图为 。
(a) 的证明较为容易(其实这个思路在引理 1 的证明中已经出现)。假设存在 ,满足 ,那么 三条边中任意两条在划分中显然不能属于同一单元,这就导致点 在至少三个单元中。
(b) 容易由引理 1 得出。
事实上,这两个条件不仅是必要的,也是 是线图的充要条件(证明见参考资料 1)。不过这一点不会在本文中用到。
考虑完共边奇三角形,再来看共边偶三角形:
定理 2:如果线图 中有两个共边的偶三角形 ,那么 在同构意义下只有三种可能(记为 )。即如果线图 不同构于 ,那么 中任意两个共边三角形中至少一个是奇的。
容易验证 是线图(图 1 展示了这三种线图及他们的原图,线图在上,原图在下)
当图中只有 四个点时,对应的线图即为 。
注意到如果 的任一导出子图不满足引理 2 中的条件,那么 一定也不满足,即 不是线图。
所以可以用程序枚举所有不超过 个点的存在两个共边偶三角形的图,并通过引理 2 来验证,从而证明定理 2.

引理 3:在线图 的划分中,设边 所在单元为 ,包含边 的三角形为 ,那么 中至少有 个在 中。
证明类似引理 1,考虑反证:假设 均不在 中,那么 需要在同一单元 中, 需要在同一单元 中。由于 在 中,所以 。但此时 都包含了边 ,矛盾。
引理 4:如果图 中的一个三角形在一个同构于 的导出子图中,那么这个三角形是奇的。
正确性显然。
下面的定理为本文的算法提供了重要的思路和理论支撑:
定理 3:设线图 (不是 )中边 共在 个三角形中,其中有 个奇三角形 ,那么有:(a) 或 ;(b) 的导出子图一定是 的划分中的一个单元。
(a) 由定理 2 容易证明。
(b) 是引理 1 的扩展,由引理 1 知 一定在同一个单元中。由引理 4 知如果 ,那么 的导出子图不可能是完全图,否则 应为奇三角形。而任何 不能同时和 有边,故也不在这个单元中。
下面描述了判断 是否是线图并构造原图的算法,其中步骤 1,2 找到了一个单元,步骤 3 从这个单元开始构造了一个划分,步骤 4 通过划分构造原图 :
- 任取 中一条边 统计其所在的三角形数量,设为 :
- 若 ,则 一定为一个同构于 的单元,转到步骤 3;
- 若 ,设该三角形为 。统计 所在三角形数量若均为 ,则容易说明此时 如果不是 ,则三角形 一定一个单元,转到步骤 3。若 在不小于 个三角形中,则用 代替 转到步骤 2, 同理;
- 若 ,转到步骤 2。
- 统计 个三角形中奇三角形个数,设为 ,那么:
- 如果 ,此时 可能为 或者不是线图,将其中任意三角形作为起始单元转到步骤 3(容易验证对于这三种图这样都能正确构造);
- 否则如果 ,由定理 3, 不为线图;
- 如果 或 ,那么由定理 3 也找到了一个单元,判断这个导出子图是否是完全图,转到步骤 3。
- 现在已经找到了划分中的一个单元 ,那么由于每个点至多在两个单元中,所以 中每个点 如果有不在 中的边 ,那么 的导出子图一定是一个单元。一直这样递归下去,如果出现导出子图不是完全图或一个点出现在三个单元中,则 不是线图。否则由 连通,必然会将得到一个合法的划分。
- 得到划分后,为每个单元在 中建一个点,并将这个点作为单元中每个点在 中对应的边的一个端点。如果一个 中的点只在一个划分中,则将 中对应边的另一个端点设为一个仅与这条边相邻的新点。
步骤 1,2 精细实现可以做到 的复杂度。步骤 3 中每个点只会访问不超过 次,故复杂度也可以做到 。步骤 4 容易做到 。
至此得到了一个 复杂度的构造线图对应的原图的算法。
最后,对于 可能存在重边的情况,设 为 在 中所有相邻点和 自己构成的集合,那么将所有 相同的 构造为重边,并对于每种 只保留这些 中的一个,不难发现这样处理不改变答案的存在性。借助哈希容易以 的复杂度完成。
总复杂度 。
参考资料
- 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.
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...