三元环

对无向图的三元环计数。

先对所有无向边定向,从度数小的点连向度数大的点,度数相同时,从编号小的点连向编号大的点。枚举每一个点 x,将其连出的点 y 都打上 x 的标记,再枚举点 y 连出的点 z,若点 zx 的标记,则 (x,y,z) 为一个三元环。

这样每个三元环只会在 x 处统计一次。

for(int i=1;i<=m;++i) { int x=ed[i].x,y=ed[i].y; if(deg[x]>deg[y]||(deg[x]==deg[y]&&x>y)) swap(x,y); add(x,y); } for(int x=1;x<=n;++x) { for(int i=head[x];i;i=e[i].nxt) vis[e[i].to]=x; for(int i=head[x];i;i=e[i].nxt) for(int j=head[e[i].to];j;j=e[j].nxt) if(vis[e[j].to]==x) ans++; }

定向后的图是不存在环的,因为如果存在环,则环上的每个点度数都相同,且编号都相同,这样的情况是不存在的。

枚举的过程中,xy 这条边对复杂度的贡献为 y 的出边个数 outy,得总贡献为 i=1moutyi

degym 时,得 outyO(m) 的。

degy>m 时,因为度数和是 O(m) 的,度数大于 degy 的点的个数是 O(m) 的,得 outyO(m) 的。

所以复杂度为 O(mm)


__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/13495875.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(708)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示