求有 n 个点 m 条边的无向连通图的个数,同时要求一号点的度数恰好为 2。用Python代码实现
时间: 2024-02-18 12:05:25 浏览: 74
根据手握插头DP思想,可以得到无向连通图的生成函数为$G(x)=\frac{1}{n}ln\frac{1}{1-x}+\frac{1}{2}ln(1-x^2)$,其中$\frac{1}{n}ln\frac{1}{1-x}$表示无向连通图的生成函数,$\frac{1}{2}ln(1-x^2)$表示一号点度数为2的情况。
因为要求一号点的度数恰好为2,所以我们需要将$n$个点分为两部分,一部分只有一个节点(即一号点),另一部分有$n-1$个节点。这样,可以将生成函数拆分为两部分:$G(x)=x(1+x)^{n-1}(\frac{1}{n}ln\frac{1}{1-x}+\frac{1}{2}ln(1-x^2))$
因此,要求的无向连通图数量为$[x^m]x(1+x)^{n-1}(\frac{1}{n}ln\frac{1}{1-x}+\frac{1}{2}ln(1-x^2))$,其中$[x^m]$表示$x^m$的系数。
以下是Python代码实现:
```python
import math
n, m = map(int, input().split())
if m < n - 1 or m > n * (n - 1) // 2:
print(0)
else:
ans = 0
for i in range(2, n + 1):
ans += math.log(i - 1)
ans -= math.log(n)
for i in range(2, n):
ans += math.log(i)
for i in range(1, m - n + 2):
ans += math.log(n - 2 + i) - math.log(i)
ans += m * math.log(2)
ans += (n - 2) * math.log(1 << (n - 2))
ans -= math.log(n)
print(int(round(math.exp(ans))))
```
其中,$ans$ 表示 $\frac{1}{n}ln\frac{1}{1-x}+\frac{1}{2}ln(1-x^2)$ 的常数项。
阅读全文