图计数
【无向图三元环计数】
定义一个有向图 \(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\) 里面是否也构成三元环。
题意:定义一个 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)}\)。