Connected Graph
求n个点的无向联通图数量,\(n\leq 50\)。
解
直接无向联通图做状态等于是以边点做考虑,难以去重,考虑联通对立面即不联通。
不难求出n个点的总方案数为\(2^{\frac{n\times (n-1)}{2}}\),所以设\(f_i\)表示n个点的无向联通图个数,因此我们有
\]
但是这样的转移存在重复,考虑特殊化去重,注意到如果这张图不合法,可以等价于任何一个联通图不合法,于是可以强制让点1不合法,因此有
\]
边界:\(f_1=1\)
答案:\(f_n\)
时间复杂度显然\(O(n^2)\),但是高精度占去大量时间。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define ll long long
using namespace std;
struct lll{
	int num[1001];
	lll(){num[0]=1;}
	il void clear(){
		memset(num,0,sizeof(num)),num[0]=1;
	}
	il void read(){
		string s;cin>>s,num[0]=s.size();
		for(ri int i(1);i<=num[0];++i)
			num[i]=s[num[0]-i];
	}
	il void print(){
		for(ri int i(num[0]);i;--i)putchar(num[i]+48);
	}
	il void operator=(string s){
		num[0]=s.size();
		for(ri int i(1);i<=s.size();++i)
			num[i]=num[s.size()-i];
	}
	il lll operator+(lll x){
		lll y;y.clear();ri int i;
		for(i=1;i<=num[0]||i<=x.num[0];++i){
			y.num[i]+=num[i]+x.num[i];
			if(y.num[i]>9)++y.num[i+1],y.num[i]-=10;
		}y.num[0]=i;
		while(!y.num[y.num[0]]&&y.num[0]>1)--y.num[0];
		return y;
	}
	il lll operator-(lll x){
		lll y;y.clear();ri int i;
		for(i=1;i<=num[0];++i){
			y.num[i]+=num[i]-x.num[i];
			if(y.num[i]<0)--y.num[i+1],y.num[i]+=10;
		}y.num[0]=i;
		while(!y.num[y.num[0]]&&y.num[0]>1)--y.num[0];
		return y;
	}
	il lll operator*(lll x){
		lll y;y.clear();ri int i,j,k;
		for(i=1;i<=num[0];++i){
			k=0;
			for(j=1;j<=x.num[0];++j)
				y.num[i+j-1]+=num[i]*x.num[j]+k,
					k=y.num[i+j-1]/10,y.num[i+j-1]%=10;
			y.num[i+x.num[0]]+=k;
		}y.num[0]=i+j;
		while(!y.num[y.num[0]]&&y.num[0]>1)--y.num[0];
		return y;
	}
}p2[2501],c[51][51],dp[51];
int main(){
	int n,i,j;p2[0]="1";
	for(i=1;i<=2500;++i)p2[i]=p2[i-1]+p2[i-1];
	for(i=0;i<=50;++i){c[i][0]="1";
		for(j=1;j<=i;++j)
			c[i][j]=c[i-1][j]+c[i-1][j-1];
	}
	while(scanf("%d",&n),n){
		memset(dp,0,sizeof(dp)),dp[1]="1";
		for(i=2;i<=n;++i){
			dp[i]=p2[i*(i-1)>>1];
			for(j=1;j<i;++j)
				dp[i]=dp[i]-dp[j]*c[i-1][j-1]*p2[(i-j)*(i-1-j)>>1];
		}dp[n].print(),putchar('\n');
	}
	return 0;
}
Connected Graph的更多相关文章
- poj 1737 Connected Graph
		// poj 1737 Connected Graph // // 题目大意: // // 带标号的连通分量计数 // // 解题思路: // // 设f(n)为连通图的数量,g(n)为非连通图的数量 ... 
- POJ1737 Connected Graph
		Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ... 
- POJ 1737 Connected Graph 题解(未完成)
		Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ... 
- 【poj1737】 Connected Graph
		http://poj.org/problem?id=1737 (题目链接) 题意 求n个节点的无向连通图的方案数,不取模w(゚Д゚)w Solution 刚开始想了个第二类斯特林数,然而并不知道怎么求 ... 
- 【Java】【高精度】【组合数】【递推】poj1737 Connected Graph
		http://blog.csdn.net/sdj222555/article/details/12453629 这个递推可以说是非常巧妙了. import java.util.*; import ja ... 
- [poj1737]Connected Graph(连通图计数)
		题意:输出题中带有$n$个标号的图中连通图的个数. 解题关键: 令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数. 则$f(n) + g(n) = h(n)$ 考虑标 ... 
- POJ 1737 Connected Graph(高精度+DP递推)
		题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ... 
- POJ 1737 Connected Graph (大数+递推)
		题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单(无重边无自环)连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS ... 
- $Poj1737\ Connected\ Graph$ 计数类$DP$
		AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ... 
随机推荐
- 【Linux】- 守护进程的启动方法
			转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ... 
- 对象拷贝extend
			如果想要把某个对象拷贝(合并)给另外一个对象使用,此时可以使用$.extend()方法 语法: $.extend([deep],target,object1,[objectN]); 1.deep:如果 ... 
- MYSql 存储过程自定义跳出
			MYSql存储过程自定义跳出 我们有时会在存储过程中进行一些判断,当判断条件达成时候我们有时会直接跳出存储过程. 但是存储过程不支持return直接返回的操作, 所以我们只能采用另一种方法,'leav ... 
- 在阿里云 既php和mysql装好之后,如何安装zabbix
			首先找到php.ini这个文件 命令如下 find / -name php.ini 然后参数修改为如下,不改装不了 max_execution_time = 300 memory_limit = 1 ... 
- vue 外卖app(2)  stylus
			1.安装 npm install stylus stylus-loader --save-dev 安装成功 2.编写样式 <style lang="stylus" ... 
- SpringBoot中使用Scheduling执行定时任务
			SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多 以下任务都是在单线程下执行的 第一步 创建SpringBoot项目 第二步 外汇 ... 
- Linux如何删除特殊字符文件名或目录?
			通过文件的inode号删除文件 先用ls -i 找出要删除文件的inode 号 2ls -i |grep xxxxxx|awk '{print $2}'|xargs -i rm -f {} xxxxx ... 
- 为什么要使用动态链接库(DLL)
			为什么要使用动态链接库(DLL) 第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维 ... 
- 返回字符串中最长连续相同字串的长度---正则实现与JavaScript实现
			JavaScript 实现 let str = 'AAABBAACCAAAADDE' function continuousString(str) { let finalObj = {} let te ... 
- NX二次开发-UFUN判断文件是否存在UF_CFI_ask_file_exist
			#include <uf.h> #include <uf_ui.h> #include <uf_cfi.h> UF_initialize(); //判断文件是否存在 ... 
