带标号的连通图计数

本文探讨了如何统计带有标号的n个顶点连通图的数量。利用f(n)表示带标记连通图总数,g(n)表示非连通图总数,它们与h(n)的关系为f(n) + g(n) = h(n) = 2^(n(n-1)/2)。通过递推公式g(n) = ∑c(n-1, k-1)f(k)h(n-k), k = 1...n,可以计算非连通图的数量。同时,发现h(n)的计算规律为h(n) = h(n-1) * 2^(n-1)。" 90052406,5749644,Linux系统时区与时间设置教程,"['Linux系统', '时间管理', '时区设置']
摘要由CSDN通过智能技术生成

统计 n 个顶点的连通图有多少个,每个顶点有标号。记 f(n) 为带标记的连通图的个数,g(n) 为带标记的非连通图的个数,则 f(n) + g(n) = h(n) = 2^(n(n-1)/2) ;考虑 g(n) 的计数:按照结点 1 所在的联通分量的点数分类,设结点 1 所在联通分量包含 k 点(k  = 1 ... n-1)则有 C(n-1, k -1) 种不同情况,每种情况下,结点 1 所在连通分量有 f(k) 种,剩余的 n - k 点组成的图有 h(n-k) 种,所以有递推关系:g(n) = ∑c(n-1, k-1)f(k)h(n-k), k = 1...n ;初始值为 f(1)=1, g(1)=1。

另外,h(n) / h(n-1) = 2^(n(n-1)/2-(n-1)(n-2)/2) = 2^(n-1),所以 h(n) = h(n-1)2^(n-1)

public class NumberOfConnectedGraph {

	public static long solve(int N) {
		
		long[] f = new long[N+1];	// 连通图数目
		long[] g = new long[N+1];	// 非连通图数目
		long[] h = new long[N+1];	// 图数目
		
		f[1] = 1; g[1] = 1; h[1] = 1;
		
		for ( int n=2; n<=N; n++ ) {
			
			// h(n) = h(n-1) * 2^(n-1)
			h[n] = ( 1 << (n-1) ) * h[n-
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值