我们先令one个点两两匹配,构成 o n e 2 \frac{one}2 2one条只含两个点的链。
不妨枚举当前有n条链。假设增加一条,则点数增加为2*n+2。
枚举点1连接的是哪个点,这有2n+1种可能;而剩下的2n个点,两两匹配成i条链。
因此,递推式为 h n + 1 = ( 2 ∗ n + 1 ) ∗ h n h_{n+1}=(2*n+1)*h_n hn+1=(2∗n+1)∗hn,其中n为链数。
现在,我们再将度数为2的点插入到这些链中。
设 g i g_i gi表示有i个度数为2的点在链中。新插一个点,我们可以插在所有链的非链首节点的左边。譬如下图:
我们可以插在任意一个蓝点左边,因此有3+2=5种方案。实际上,记有k条链,第i条链的链长为 l e n i len_i leni,插入新点的方案即为 ∑ i = 1 k l e n i − 1 \sum_{i=1}^k len_i-1 ∑i=1kleni−1。 不难发现,这其实等于已插入的点数+链数。
因此, g i = g i − 1 ∗ ( i − 1 + o n e 2 ) g_i=g_{i-1}*(i-1+\frac{one}2) gi=gi−1∗(i−1+2one),其中 o n e 2 \frac{one}2 2one为链数。
环的情况
环的情况就有些复杂了。
考虑DP。设 f i , j f_{i,j} fi,j表示i个度数为2的点在环上,其中有j个一元环的方案数。
设 f i , j f_{i,j} fi,j表示i个度数为2的点,其中j个点在环上(即剩下的i-j个点在链上)的方案数。
有以下三种转移: f i , j = { f i − 3 , j − 3 ∗ C i − 1 2 新 建 三 元 环 f i − 1 , j − 1 ∗ ( j − 1 ) 将 点 i 插 入 一 个 环 中 f i − 1 , j ∗ ( i − j − 1 + o n e 2 ) 将 点 i 插 入 一 条 链 中 f_{i,j}=\left\{ \begin{aligned} &f_{i-3,j-3} *C_{i-1}^2 & & 新建三元环 \\ &f_{i-1,j-1} *(j-1) & & 将点i插入一个环中 \\ &f_{i-1,j} \ \ \ *(i-j-1+\frac{one}2) & & 将点i插入一条链中 \end{aligned} \right. fi,j=⎩⎪⎪⎨⎪⎪⎧fi−3,j−3∗Ci−12fi−1,j−1∗(j−1)fi−1,j∗(i−j−1+2one)新建三元环将点i插入一个环中将点i插入一条链中
新建环的贡献为何是 C i − 1 2 C_{i-1}^2 Ci−12呢?我们假定点i就在新环内,然后从剩下的i-1个点中选2个出来陪它。如若不然,则有可能算重。然后不必再因会翻转除以2,因为三元环定是唯一的。
这样的话, a n s = ∑ i = 0 t w o f t w o , i ans=\sum_{i=0}^{two} f_{two,i} ans=∑i=0twoftwo,i,其中two为度数为2的节点的个数。
输入文件内容: Hello my Dear: This is a secret, so don’t tell anyone else! Mr. Right is LiXiaoMing. ac代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE *fp,*fq;char s[150];int i;if((fp…
Description
给定N个度数为1或2的点,求所有带标号简单无向图(无重边和自环)的方案数。
Solution
设度数为2的点有 n n n个,度数为1的有 m m m个。 因为只有1和2,所以图一定是由许多链和大小大于等于3的简单环构成的…