POJ 1737 Connected Graph 递推

9 篇文章 0 订阅

题目大意:求n个点能组成多少种无向连通图

多年的老心病终于干掉了- -

令f[i]表示i个点能组成多少种无向图

首先易知我们能生成2^(i*(i-1)/2)种图 但是一些是不合法的 我们要将不合法的干掉

枚举1号节点与多少个点连通

设1号节点所在联通块大小为j(1<=j<=i-1)

那么与1相连的其它点有C(i-1,j-1)中选法,1号节点所在联通块有f[j]种连法,不与1号节点相连的点有2^((i-j)*(i-j-1)/2)种连法

故得到递推式f[i]=2^(i*(i-1)/2)-Σ[1<=j<=i-1]C(i-1,j-1)*f[j]*2^((i-j)*(i-j-1)/2)

w = open("out.out", "w")

f = [0] * 60
C = [[0] * 60 for i in range(60)]

for i in range(0,51):
	C[i][0] = 1
	for j in range(1,i+1):
		C[i][j] = C[i-1][j] + C[i-1][j-1]
for i in range(1,51):
	f[i] = 2**(i*(i-1)//2)
	for j in range(1,i):
		f[i] -= C[i-1][j-1] * (2**((i-j)*(i-j-1)/2)) * f[j]
	w.write("\"%d\",\n" %f[i] )


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值