图计数

【无向图三元环计数】

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

性质\(G'\) 中每个点的出度 \(\le 2\sqrt m\)

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

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

这个性质有什么用呢?

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

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

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

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

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

【有向图三元环计数】

其实我们可以暴力一点。

\(G_0\) 为一个无向图,是 \(G\) 中所有边去掉了方向。

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

应用:Counting Stars

题意:定义一个 star 子图为:四个点五条边 的子图。求 \(G\) 中有多少个 star 子图。\(n\le 3e5, m\le 6e5\)

对于每条边 \(e\),统计 \(f_e\)\(e\) 属于多少个三元环。则每条边的答案贡献就是 \(C_{f_e}^2\)

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

【无向图四元环计数】

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

①:\(A\rightarrow B,C\rightarrow D\),先枚举 \(A\)\(A\) 对于每个 \(D\),求出 \(f_D\)\(A\rightarrow i\rightarrow D\) 的数量。\(A\) 的数量就是 \(\sum_Df_D(f_D-1)\)

②:\(B\rightarrow C\rightarrow D\),还有 \(A\rightarrow B,D\)。先枚举 \(B\),对于每个 \(D\),求出两个值 \(f_D\)\(B\rightarrow i\rightarrow D\) 的个数,\(g_D\)\(B\leftarrow A\rightarrow D\) 的个数。则 \(B\) 的答案就是 \(\sum_Df_D\cdot g_D\)

\(f_D\) 很好求,在 ① 里做过了;而对于 \(g_D\),我们先枚举 \(B\),再枚举 \(B\) 的前驱,再枚举 \(B\) 前驱的后继,一共 \(O(m\sqrt m)\)

注意:这里不能先枚举 \(A\),因为 \(A\rightarrow B\rightarrow C\rightarrow D\) 有三层,复杂度会爆。

③:\(A,C\rightarrow B,D\)。先枚举 \(B\)\(B\) 对于每个 \(D\) 求出 \(f_D\)\(D\leftarrow i\rightarrow B\)\(i\) 个数。则 \(B\) 的答案就是 \(C^2_{f_D}\)

\(f_D\) 也很简单,和 ② 中 \(g_D\) 的求法一样。\(O(m\sqrt m)\)

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

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

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

应用:CF1468M

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

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

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

【其他图计数】

欧拉图计数

题意:求欧拉子图个数。

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

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

结论:\(2^{m-(n-1)}\)

posted @ 2024-02-09 09:36  FLY_lai  阅读(14)  评论(0编辑  收藏  举报