三元环&四元环计数
三元环计数
求出无向图三元环和四元环的个数
做法
将图中的所有边按照度数由大向小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v 并标记,再枚举 v 的出边到的点 w,如果也有标记则表示找到了一个三元环,时间复杂度为 \(\Theta(m\sqrt m)\),很容易证明一个三元环只会被枚举一次
时间复杂度证明
网上有好多证明都是错的,搞了半天才搞懂
以下分析不带常数,比如用 \(\sqrt m\) 代替 \(\sqrt {2m}\)
考虑每个点对答案的贡献,即有若干条入边枚举到它,然后再枚举它的所有出边,也就是 \(in_x*out_x\),由于是度数从大向小连的边,所以 \(in_x \le \sqrt m\),为什么呢,考虑如果 \(in_x > \sqrt m\),那么它有至少 \(\sqrt m\) 条边,而连向它的点的度数都大于它的度数,而最多只可能有 \(\sqrt m\) 个度数大于 \(\sqrt m\) 的点,所以矛盾。因此总时间复杂度是 \(\Theta(\sqrt m*m)=\Theta(m\sqrt m)\) 的
同理如果从度数小的连向度数大的,那么 \(out_x \le \sqrt m\),读者可自证
四元环计数
做法
与三元环有些区别在于这里既要用到定向后的有向边,也要用到没有定向的无向边
下文无向边指原图中的边,出边和入边指有向图的边
将图中所有的边按度数由大到小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v ,然后枚举 v 的无向边到的点 w,其中要求 w 的度数要小于 u,时间复杂度仍然为 \(\Theta(m\sqrt m)\),每个四元环只会在其最大度数点对面的位置被统计一次
时间复杂度证明
仍然考虑一个点对复杂度的贡献,首先它被 \(in_x\) 条边枚举到,然后遍历它所有的 \(deg_x\) 条无向边,也就是 \(in_x * deg_x\),同三元环的证明,\(in_x\) 不会超过 \(\sqrt m\),复杂度得证
那么从小向大连当然也是可以的,但 u 要先枚举无向边,然后再枚举有向边即可