无向图的 三元环 - 四元环 计数
无向图的 三元环 - 四元环 计数
问题描述:
给定一个 \(n\) 个点 \(m\) 条边的无向图,统计其中三元环 / 四元环的个数。
三元环
考虑枚举一条边 \((u,v)\),为了避免重复我们可能令 \(u<v\)。
然后暴力枚举求出 \(u,v\) 两个点出边的交点个数。
具体的,先对于 \(u\) 的出点打标记,然后查询 \(v\) 的出点中被标记的个数。
tips: 当然每个三元环会被算三次
这样复杂度显然是 \(O(nm)\) 的,当 \(v\) 点度数大时就可以卡掉。
优化
强制 \(deg_u>deg_v\or deg_u=deg_v,u<v\)。
考虑先固定 \(u\),预处理出标记情况,然后枚举每个合法的 \((u,v)\),再去枚举 \(v\) 的出边。
考虑证明这个复杂度上限为 \(O(m\sqrt m)\) 级别。
假设对于 \((u,v)\):
1.如果 \(deg_v\leq \sqrt m\),显然它们被枚举的次数总和 \(\leq m\),枚举复杂度为 \(O(m\sqrt m)\)。
2.对于 \(deg_v>\sqrt m\),则显然有 \(deg_u\ge deg_v>\sqrt m\)。
会枚举到 \(v\) 的 \(u\) 显然不超过 \(\sqrt m\) 个,因此这样的 \(v\) 遍历次数为 \(O(m\sqrt m)\)。
故复杂度为 \(O(m\sqrt m)\)。
\[ \ \]
四元环
类似三元环的方法,同样按照 \((deg_u,u)\) 二元组递减的顺序设定排名。
强制 \(u\) 为四元环中排名最小的点,枚举合法的边 \((u,v)\),那么我们计算的实际上是每个 \(v\) 的出边的交的个数。
依次枚举每个 \(v\) 的过程中,对于出边 \((v,w)\) 维护 \(w\) 出现次数,即可求出交点个数。
容易发现这样的计算不会出现重复。
而复杂显然是与上面相同的,还去掉对于 \(u\) 的出点打标记的过程。