三/四元环计数
对于一个 n 个点,m 条边的无向图
我们可以在 O(mm) 的复杂度内计算出该图的三/四元环个数
三元环
记 dx 表示原图中点 x 的度数
考虑将无向图转为有向图
对于一边 (u,v) 且 u<v
- 若 du≥dv 则 u→v
- 若 du<dv 则 v→u
我们可以证明连出的新图为一个有向无环图
若存在环 (a0,a1,...,ak)
则 da0≥da1≥da2...≥dak≥da0
故 da0=da1=...=dak
所以 a0<a1<a2<...<ak<a0,矛盾
显然原图中的三元环 (u,v,w) 在新图中的表现形式一定为 u→v,u→w,v→w
我们考虑在 u 点处计数
枚举 u,给 u 在新图上可一步到达的点打标记,再枚举点 v,枚举 w 判断是否被 u 标记过
计数即可
考虑将枚举 w 的复杂度记在边 u→v 上,为 outv:v的出度
总复杂度为∑(u,v)∈Eoutv+∑uoutu
- 若 outv≤m ,复杂度 O(mm)
- 若 outv>m,又 outu>m,总共仅有 m 条边,这样的 (u,v) 仅有 O(m) 个,复杂度 O(mm)
四元环
同样考虑按三元环的方法建出新图
显然一个四元环在新图中至少有一个度数为2的点,至多2个这样的点,我们保证在度数最大的那个点计数即可
考虑一个四元环 (u,v,w,x),我们分成 u−v→w,u−x→w 两条链计算
枚举 u ,枚举原图的边以枚举 v ,再枚举 w,(du>dw or u<w)
答案算上 w 点上的标记,并在 w 上多打一个来自 v 的tag
复杂度为 O(∑(v,w)∈Eedgev+∑winw)
类似讨论,可得到复杂度为 O(mm)