三/四元环计数
三/四元环计数
对于一个 \(n\) 个点,\(m\) 条边的无向图
我们可以在 \(O(m\sqrt m)\) 的复杂度内计算出该图的三/四元环个数
三元环
记 \(d_x\) 表示原图中点 \(x\) 的度数
考虑将无向图转为有向图
对于一边 \((u,v)\) 且 \(u<v\)
- 若 \(d_u\geq d_v\) 则 \(u\to v\)
- 若 \(d_u<d_v\) 则 \(v\to u\)
我们可以证明连出的新图为一个有向无环图
若存在环 \((a_0,a_1,...,a_k)\)
则 \(d_{a_0}\geq d_{a_1}\geq d_{a_2}...\geq d_{a_k}\geq d_{a_0}\)
故 \(d_{a_0}=d_{a_1}=...=d_{a_k}\)
所以 \(a_0<a_1<a_2<...<a_k<a_0\),矛盾
显然原图中的三元环 \((u,v,w)\) 在新图中的表现形式一定为 \(u\to v,u\to w,v\to w\)
我们考虑在 \(u\) 点处计数
枚举 \(u\),给 \(u\) 在新图上可一步到达的点打标记,再枚举点 \(v\),枚举 \(w\) 判断是否被 \(u\) 标记过
计数即可
考虑将枚举 \(w\) 的复杂度记在边 \(u\to v\) 上,为 \(out_v:v的出度\)
总复杂度为\(\sum_{(u,v)\in E}out_v+\sum_{u}out_u\)
- 若 \(out_v\leq \sqrt m\) ,复杂度 \(O(m\sqrt m)\)
- 若 \(out_v>\sqrt m\),又 \(out_u>\sqrt m\),总共仅有 \(m\) 条边,这样的 \((u,v)\) 仅有 \(O(\sqrt m)\) 个,复杂度 \(O(m\sqrt m)\)
四元环
同样考虑按三元环的方法建出新图
显然一个四元环在新图中至少有一个度数为2的点,至多2个这样的点,我们保证在度数最大的那个点计数即可
考虑一个四元环 \((u,v,w,x)\),我们分成 \(u-v\to w,u-x\to w\) 两条链计算
枚举 \(u\) ,枚举原图的边以枚举 \(v\) ,再枚举 \(w,(d_u>d_w \space or \space u<w)\)
答案算上 \(w\) 点上的标记,并在 \(w\) 上多打一个来自 \(v\) 的tag
复杂度为 \(O(\sum_{(v,w)\in E}edge_v+\sum_{w}in_w)\)
类似讨论,可得到复杂度为 \(O(m\sqrt m)\)