HELLO WORLD--一起加油(🍺)!|

kingwzun

园龄:3年6个月粉丝:111关注:0

2022-09-07 11:37阅读: 66评论: 0推荐: 0

求原图与其补图的三元环个数

原文:https://www.cnblogs.com/NicoDafaGood/p/7552893.html

题意

给一个n个点,m条边的无向图,求该图与其补图的三元环个数.
(n<=1e5,m<=1e5,保证没有自环)

思路

首先考虑一个完全图,任意三个点都可以构成一个三元环.

因此完全图三元环的个数为C3n=n(n1)(n2)6

当且仅当三元环中三条边都为原图边或补图边时这个三元环会在原图或补图中出现
因此不会在原图或者补图中出现的三元环:
一定是至少有一条边在原图,至少有一条边在补图的,它们在两图中都是残缺的。

我们记录每个点在原图中的度d[i] .
那么 d[i](n1d[i]) 就是经过i点的不在原图也不在补图的三元环个数。(n-1-d[i]为i在补图中的度)(也就是一条边在原图,一条边在补图)

由于我们对每个点都进行了计算,所以算出来的值是两倍的,需要除以2。
也就是d[i](n1d[i])2条边不会在原图和补图中出现

所以原图和补图中出现的环数和为

n(n1)(n2)6d[i](n1d[i])2

实现

现在只需找到原图中环的个数

将所有点分成两类:

  1. <sqrt(m)
  2. >sqrt(m)

先求包含第一类点的三元环个数.
由于边很少,所以枚举2条边即可.由于一个点的度不超过sqrt(m),所以一条边最多被枚到(sqrt(m))次,最多枚M条边,所以这个操作时O(mm)的.

再求不包含第一类点的三元环个数.
由于每条边贡献2个度,所以二类点的数量是O(m)级的.直接枚举三个点,复杂度O((m)3)=O(mm)

所以算法总的复杂度是O(mm)的.

代码

本文作者:kingwzun

本文链接:https://www.cnblogs.com/kingwz/p/16664829.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(66)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起