三/四元环计数

三/四元环计数

对于一个 \(n\) 个点,\(m\) 条边的无向图

我们可以在 \(O(m\sqrt m)\) 的复杂度内计算出该图的三/四元环个数

三元环

\(d_x\) 表示原图中点 \(x\) 的度数

考虑将无向图转为有向图

对于一边 \((u,v)\)\(u<v\)

  1. \(d_u\geq d_v\)\(u\to v\)
  2. \(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\)

  1. \(out_v\leq \sqrt m\) ,复杂度 \(O(m\sqrt m)\)
  2. \(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)\)

posted @ 2021-08-23 16:20  juju527  阅读(116)  评论(0编辑  收藏  举报