图计数

【无向图三元环计数】

定义一个有向图 G:把 G 中每条边改成从度数小的点指向度数大的点 的有向边。

性质G 中每个点的出度 2m

证明:若 u 的出度 >2m,则显然 u 在原图中的度数 >2m。所以 u 指向的至少 2m+1 个点的度数,也都 >2m。(因为是度数小指向度数大的)

2m 个点,每个点的度数都大于 2m,则总边数显然 >m

这个性质有什么用呢?

推论:(在 G 中)枚举点 x ,再枚举 x 的后继 y,再枚举 y 的后继 z 的复杂度是 O(mm) 的。

证明:可能有一种不准确的估计:x 点是 O(n) 枚举的,枚举 x 的后继 O(m),再枚举一个又乘 O(m),总复杂度是 O(nm) 的。但实际上,枚举 xx 的后继,相当于枚举了所有边的起点,总复杂度不是 O(nm) 而是 O(m) 的。所以总复杂度是 O(mm)

由此可以设计出我们的算法:

枚举点 a,枚举 a 的后继 b,将所有 b 打上标记;然后枚举所有 b 的后继 c,若 c 有标记,ans+1

提示:这个算法不只是求出了数量,它直接找到了所有三元组。所以如果每条边有边权,求所有三元环边权之和也是可以的。

【有向图三元环计数】

其实我们可以暴力一点。

G0 为一个无向图,是 G 中所有边去掉了方向。

然后对 G0 找出所有三元环,然后在 G 里面是否也构成三元环。

应用:Counting Stars

题意:定义一个 star 子图为:四个点五条边 的子图。求 G 中有多少个 star 子图。n3e5,m6e5

对于每条边 e,统计 fee 属于多少个三元环。则每条边的答案贡献就是 Cfe2

怎么算 fe?枚举所有三元环,然后给三条边的 fe+1 即可。

【无向图四元环计数】

无向图定向后有三种可能情况。分别计数。

①:AB,CD,先枚举 AA 对于每个 D,求出 fDAiD 的数量。A 的数量就是 DfD(fD1)

②:BCD,还有 AB,D。先枚举 B,对于每个 D,求出两个值 fDBiD 的个数,gDBAD 的个数。则 B 的答案就是 DfDgD

fD 很好求,在 ① 里做过了;而对于 gD,我们先枚举 B,再枚举 B 的前驱,再枚举 B 前驱的后继,一共 O(mm)

注意:这里不能先枚举 A,因为 ABCD 有三层,复杂度会爆。

③:A,CB,D。先枚举 BB 对于每个 D 求出 fDDiBi 个数。则 B 的答案就是 CfD2

fD 也很简单,和 ② 中 gD 的求法一样。O(mm)

注意这里不能枚举 A 然后求 fC,因为枚举 A 后继的前驱 复杂度就不对了。

三种情况都可以 O(mm) 求出来,总复杂度还是 O(mm)

注意:统计总数可以 O(mm),但是枚举所有四元环出来不是 O(mm) 的。

应用:CF1468M

题意:给定若干个集合,两个集合若有至少两个相同元素,则相似。找出一对相似集合,或说明无解。

把每个集合抽象为一个点,每个元素也抽象为一个点。一个集合向其包含的所有元素连一条无向边。于是出现一个二分图。

答案就是在这个二分图里面四元环计数。

【其他图计数】

欧拉图计数

题意:求欧拉子图个数。

欧拉图:每个点度数为偶数。

不妨假设图是连通图。否则每个连通分量求一下然后相乘即可。

结论:2m(n1)

posted @   FLY_lai  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示