三/四元环计数
对于一个 n 个点,m 条边的无向图
我们可以在 O(m√m) 的复杂度内计算出该图的三/四元环个数
三元环
记 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(m√m)
- 若 outv>√m,又 outu>√m,总共仅有 m 条边,这样的 (u,v) 仅有 O(√m) 个,复杂度 O(m√m)
四元环
同样考虑按三元环的方法建出新图
显然一个四元环在新图中至少有一个度数为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(m√m)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现