三元环计数

21 篇文章 1 订阅
17 篇文章 0 订阅

也许更好的阅读体验

问题描述

给一张 n n n个点, m m m条边的简单无向图,求解有多少个三元环
三元环:一个三元组 ( i , j , k ) \left(i,j,k\right) (i,j,k)表示三个点,要求存在边 ( i , j ) , ( i , k ) , ( j , k ) \left(i,j\right),\left(i,k\right),\left(j,k\right) (i,j),(i,k),(j,k)


解决方法

定义点的大小

我们先把每个点 i i i定义一个双关键字 ( d e g i , i d i ) \left(deg_i,id_i\right) (degi,idi),其中 d e g i , i d i deg_i,id_i degi,idi分别表示 i i i点的度数与编号,这样每个点就有了严格的大小关系

转为有向图

然后我们将这张无向图转变为有向图:把所有的边 ( i , j ) \left(i,j\right) (i,j)改为由关键字大的点向关键字小的点连边,这样我们就可以得到一张有向无环图

找环

找环分为三步

  • 枚举一个点 i i i,将所有出边所连接的点标记为 i i i
  • 枚举一个由 i i i连出的点 j j j
  • 枚举所有由 j j j连出的点 k k k,若 k k k有标记了且该标记为 i i i,就表明找到了一个三元环

这样做就保证了每个环只会被 i i i所找到
时间复杂度,最高为 O ( m m ) O\left(m\sqrt{m}\right) O(mm )

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值