三元环 & 四元环计数 学习笔记

考虑对一个无向图数三元环 / 四元环(注意,环是一个边集而非点集,在四元环中将体现两者的区别)。

这两个算法基于以下神仙操作(不知道发明者是怎么想到的?):重定向每条边,规则是按度数为第一关键字点号为第二关键字排序后(第二关键字的存在仅是为了使严格比较总能进行),小的连向大的。显然这是一张 DAG。这样一个特殊的重定向方式使得以下优美性质成立:新图中每个点的出度为 \(\mathrm O(\sqrt m)\)

证明:对原图中度数 \(\leq \sqrt m\) 的显然;对 \(>\sqrt m\) 的,根据排序方式可知,它在新图中连出的点在原图中的度数都 \(>\sqrt m\),这样的点数是 \(\mathrm O(\sqrt m)\)。不难发现这个证明使用了根分的思想。

一个小推论:\(A\to B\to C\)\(A\gets B\to C\) 的数量都是 \(\mathrm O(m\sqrt m)\)(在现实中非常不满),对 \(B\to C\) 进行度数分析,再乘上 \(\sum\limits_B cnt_A\) 即可得到。


下面讲两个算法。(五元环及以上计数听说不可做?)

三元环计数

显然,原无向图中的三元环在新 DAG 中的边向情况只可能是 \(A\to B,B\to C,A\to C\)。那么如果数 \(A\to B\to C\) 显然是不重不漏的。于是枚举这样的东西,然后判 \(A\to C\) 是否有边即可,复杂度 \(\mathrm O(m\sqrt m)\)(三元环计数算法能枚举到每个三元环,这从侧面说明了三元环数量就是 \(\mathrm O(m\sqrt m)\))。但是对 \(n^2\) 无法承受的数据范围,\(\mathrm O(1)\) 判边的存在性是无法做到的。在三元环计数里,这很好解决,只需要对每个 \(A\) 标记一波出点,然后等所有 \(A\) 开头的这个三元链都枚举完之后撤销标记即可。

mol ban tea code

四元环计数

随便枚举一下(大概可以通过枚举每个点的度数来粗糙分析?)得到边向情况有三种:

  1. \(A\to B,B\to C,A\to D,D\to C\)
  2. \(A\to B,B\to C,A\gets D,D\to C\)
  3. \(A\gets B,B\to C,A\gets D,D\to C\)

根据我列的方式就可以看出来,设 \(?\to?\to?\) 是 A1,\(?\gets?\to?\) 是 A2,那么就是 A1 * 2, A1 + A2, A2 * 2 这三种。

第一种中,\(A\) 显然是 unique 的,于是枚举 \(A\) 可以不重不漏。于是就枚举 \(A\),然后枚举一下 \(A\) 开头的 A1,数量为 \(cnt\),贡献就是 \(\dbinom{cnt}2\)

第二种中,\(A\) 显然是 unique 的,于是枚举 \(A\) 可以不重不漏。于是就枚举 \(A\),然后枚举一下 \(A\) 开头的 A1, A2,数量为 \(cnt1,cnt2\),贡献就是 \(cnt1\times cnt2\)

第三种中,\(A,C\) 具有同等地位,直接枚举 \(A\) 的话每个会被算两遍,最终除以二即可。于是就枚举 \(A\),然后枚举一下 \(A\) 开头的 A2,数量为 \(cnt\),贡献就是 \(\dbinom{cnt}2\)

综上,要做的就是枚举每个点,然后枚举这个点开头的 A1 和 A2,复杂度 \(\mathrm O(m\sqrt m)\)

代码 gym102028L 的题解里有。

posted @ 2021-04-15 22:20  ycx060617  阅读(668)  评论(0)    收藏  举报