图计数问题
规定
-
d_i 为出度
-
S_i 为出点集
-
g_i 为入度
无向图三元环计数
首先我们给边重定向,由度数大的向度数小的,度数相等的按点的编号就行。 然后我们枚举一个点 u,遍历 v∈Su,再遍历 w∈Sv,如果 w∈Su,那么我们就找到了一个三元环 (u,v,w) 。 可以证明其复杂度为 O(m\sqrt m) 。并且在这个算法的过程中我们是找到了每一个三元环的。
复杂度证明:
复杂度为 O(\sum_{(u,v)\in E}d_v)
若 d_v<\sqrt m,复杂度为 O(m\sqrt m)
否则有 d_u \ge d_v >\sqrt m,可以发现这样的边不超过 \sqrt m 个,复杂度为 O(m\sqrt m)
有向图三元环计数
首先我们把边都看作是无向边,然后按照上面的算法跑一遍。 但是按照上面的算法找出来的 (u,v,w) 并不一定满足 (u,v),(v,w),(w,u) 都在这个有向图中。 所以我们在枚举到某个三元环的时候判断一下是否存在这三条边就行了。
竞赛图找一个三元环
我们知道一个竞赛图如果存在一个环,那么它一定存在一个三元环。 我们先考虑添加一个看似没什么用的条件:不存在支配一切的元素,也就是 d_i 不可能为 n-1 ,每个点总有入度。
那么,我们便可以构造出一个三元环:
-
首先找到出度最大的点 x ;
-
然后暴力枚举找到任意一条 y\rightarrow x ;
-
此时一定存在一个 z 满足 (y,x,z) 为三元环(反证法:若不存在 x\rightarrow z\rightarrow y ,说明 x 的出点集合是 y 出点集合的真子集,与 x 出度最大矛盾),暴力找到它。
接着,完全可以去掉限制条件。只要依次把出度为 n-1,n-2,n-3,... 的点删掉(这些点一定不在三元环中),直到不存在无入度的点。不难发现,只要有环,最终一定不会只有一个点。
竞赛图三元环计数
考虑补集容斥,总共有 \binom n3 个三元组。 枚举一个点 u,∀v,w∈Su,(u,v,w) 不能构成三元环。 而且显然这样的三元组只会在 u 被枚举到一次。 所以总的三元环个数为 \binom n3−\sum\limits_{i=1}^n\binom {d_i}2 。
竞赛图三元环期望
就是 n 个点的竞赛图给定了 m 条边的方向,剩下的方向都不确定,求期望三元环个数。 这里我们先计算出确定的出度以及入度。然后记 li=n−1−di−gi 即某个点连出去的未确定方向的边数。 答案为 \binom n3−\sum\limits_{i=1}^n\left(\binom {d_i}2+\frac {d_il_i}2+\frac{\binom{l_i}2}4\right)。
考虑每一个点,两条都是确定的边就是 \binom d2,一条确定一条不确定就是 \frac {d_il_i}2,两条都不确定就是 \frac{\binom{l_i}2}4。
Prufer 序列
树与序列的转换
树转序列
每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复 n-2 次后就只剩下两个结点,算法结束。
性质
-
在构造完 Prufer 序列后原树中会剩下两个结点,其中一个是根,另一个是编号最大的点 n。
-
每个结点在序列中出现的次数是其度数减 1。(没有出现的就是叶结点)
序列转树
根据 Prufer 序列的性质,我们可以得到原树上每个点的度数。然后你也可以得到编号最小的叶结点,而这个结点一定与 Prufer 序列的第一个数连接。然后我们同时删掉这两个结点的度数。
讲到这里也许你已经知道该怎么做了。每次我们选择一个度数为 1 的最小的结点编号,与当前枚举到的 Prufer 序列的点连接,然后同时减掉两个点的度。到最后我们剩下两个度数为 1 的点(根和编号最大的点 n),把它们建立连接。
Cayley 公式
完全图 K_n 有 n^{n-2} 棵生成树。
图连通方案数
一个 n 个点 m 条边的带标号无向图有 k 个连通块。我们希望添加 k-1 条边使得整个图连通。求方案数。
设 s_i 表示每个连通块的数量。我们对 k 个连通块构造 Prüfer 序列,然后你发现这并不是普通的 Prüfer 序列。因为每个连通块的连接方法很多。不能直接淦就设啊。于是设 d_i 为第 i 个连通块的度数。由于度数之和是边数的两倍,于是 \sum_{i=1}^kd_i=2k-2。则对于给定的 d 序列构造 Prüfer 序列的方案数是
$$
\binom{k-2}{d_1-1,d_2-1,\cdots,d_k-1}=\frac{(k-2)!}{(d_1-1)!(d_2-1)!\cdots(d_k-1)!}
$$
对于第 i 个连通块,它的连接方式有 {s_i}^{d_i} 种,因此对于给定 d 序列使图连通的方案数是
$$
\binom{k-2}{d_1-1,d_2-1,\cdots,d_k-1}\cdot \prod_{i=1}^k{s_i}^{d_i}
$$
现在我们要枚举 d 序列,式子变成
$$
\sum_{d_i\ge 1,\sum_{i=1}^kd_i=2k-2}\binom{k-2}{d_1-1,d_2-1,\cdots,d_k-1}\cdot \prod_{i=1}^k{s_i}^{d_i}
$$
好的这是一个非常不喜闻乐见的式子。但是别慌!我们有多元二项式定理:
$$
(x_1 + \dots + x_m)^p = \sum_{\substack{c_i \ge 0 ,\ \sum_{i=1}^m c_i = p}} \binom{p}{c_1, c_2, \cdots ,c_m}\cdot \prod_{i=1}^m{x_i}^{c_i}
$$
那么我们对原式做一下换元,设 e_i=d_i-1,显然 \sum_{i=1}^ke_i=k-2,于是原式变成
$$
\sum_{e_i\ge 0,\sum_{i=1}^ke_i=k-2}\binom{k-2}{e_1,e_2,\cdots,e_k}\cdot \prod_{i=1}^k{s_i}^{e_i+1}
$$
化简得到
$$
(s_1+s_2+\cdots+s_k)^{k-2}\cdot \prod_{i=1}^ks_i
$$
即
$$
n^{k-2}\cdot\prod_{i=1}^ks_i
$$
这就是答案啦