题目
给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树
输入:第一行为N(0<N<=1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1
输出:一个整数,表示不同的满足要求的树的个数,无解输出0
思路来源
https://m-sea-blog.com/archives/1661/
题解
prufer序列,常用来解决,和度数有关的树计数问题

大数,懒得粘板子,py一发入魂,这个列表用得妙啊
太久不用py了,除法要用整除的//,否则会被理解成double从而在洛谷里RE
代码
n = int(input())
fac = [1]
ans = 1
for i in range(1, n - 1):
fac = fac + [fac[i - 1] * i]
ans = fac[n - 2]
cnt = 0
sum = n - 2
for i in range(n):
d = int(input())
if d != -1:
ans = ans // fac[d - 1]
sum -= d-1
else:
cnt += 1
ans = ans // fac[sum]
for i in range(sum):
ans = ans * cnt
print(ans)

本文探讨了利用Prufer序列解决特定条件下树的计数问题,通过实例展示了如何根据节点度数计算满足条件的不同树的数量,并提供了一段Python代码实现。
421

被折叠的 条评论
为什么被折叠?



