无向图的 三元环 - 四元环 计数
无向图的 三元环 - 四元环 计数
问题描述:
给定一个\(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\)的出点打标记的过程