三/四元环计数

三/四元环计数

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

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

三元环

dx 表示原图中点 x 的度数

考虑将无向图转为有向图

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

  1. dudvuv
  2. du<dvvu

我们可以证明连出的新图为一个有向无环图

若存在环 (a0,a1,...,ak)

da0da1da2...dakda0

da0=da1=...=dak

所以 a0<a1<a2<...<ak<a0,矛盾

显然原图中的三元环 (u,v,w) 在新图中的表现形式一定为 uv,uw,vw

我们考虑在 u 点处计数

枚举 u,给 u 在新图上可一步到达的点打标记,再枚举点 v,枚举 w 判断是否被 u 标记过

计数即可

考虑将枚举 w 的复杂度记在边 uv 上,为 outv:v

总复杂度为(u,v)Eoutv+uoutu

  1. outvm ,复杂度 O(mm)
  2. outv>m,又 outu>m,总共仅有 m 条边,这样的 (u,v) 仅有 O(m) 个,复杂度 O(mm)

四元环

同样考虑按三元环的方法建出新图

显然一个四元环在新图中至少有一个度数为2的点,至多2个这样的点,我们保证在度数最大的那个点计数即可

考虑一个四元环 (u,v,w,x),我们分成 uvw,uxw 两条链计算

枚举 u ,枚举原图的边以枚举 v ,再枚举 w,(du>dw or u<w)

答案算上 w 点上的标记,并在 w 上多打一个来自 v 的tag

复杂度为 O((v,w)Eedgev+winw)

类似讨论,可得到复杂度为 O(mm)

posted @   juju527  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示