Connected Graph

求n个点的无向联通图数量,\(n\leq 50\)。

直接无向联通图做状态等于是以边点做考虑,难以去重,考虑联通对立面即不联通。

不难求出n个点的总方案数为\(2^{\frac{n\times (n-1)}{2}}\),所以设\(f_i\)表示n个点的无向联通图个数,因此我们有

\[f_i=2^{\frac{n(n-1)}{2}}-\sum_{j=1}^{i-1}f_jC_i^j2^{\frac{(i-j)(i-j-1)}{2}}
\]

但是这样的转移存在重复,考虑特殊化去重,注意到如果这张图不合法,可以等价于任何一个联通图不合法,于是可以强制让点1不合法,因此有

\[f_i=2^{\frac{n(n-1)}{2}}-\sum_{j=1}^{i-1}f_jC_{i-1}^{j-1}2^{\frac{(i-j)(i-j-1)}{2}}
\]

边界:\(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的更多相关文章

  1. poj 1737 Connected Graph

    // poj 1737 Connected Graph // // 题目大意: // // 带标号的连通分量计数 // // 解题思路: // // 设f(n)为连通图的数量,g(n)为非连通图的数量 ...

  2. POJ1737 Connected Graph

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  3. POJ 1737 Connected Graph 题解(未完成)

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  4. 【poj1737】 Connected Graph

    http://poj.org/problem?id=1737 (题目链接) 题意 求n个节点的无向连通图的方案数,不取模w(゚Д゚)w Solution 刚开始想了个第二类斯特林数,然而并不知道怎么求 ...

  5. 【Java】【高精度】【组合数】【递推】poj1737 Connected Graph

    http://blog.csdn.net/sdj222555/article/details/12453629 这个递推可以说是非常巧妙了. import java.util.*; import ja ...

  6. [poj1737]Connected Graph(连通图计数)

    题意:输出题中带有$n$个标号的图中连通图的个数. 解题关键: 令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数. 则$f(n) + g(n) = h(n)$ 考虑标 ...

  7. POJ 1737 Connected Graph(高精度+DP递推)

    题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...

  8. POJ 1737 Connected Graph (大数+递推)

    题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单(无重边无自环)连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS ...

  9. $Poj1737\ Connected\ Graph$ 计数类$DP$

    AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...

随机推荐

  1. kafka原理概念提炼

    Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...

  2. 天道神诀--IPSAN(iscsi配置)

    数据存储技术 DSA(Direct Attacted Storage 直接附加存储)本地硬盘 NAS(Network Attacted Storage 网络附加存储)网络服务共享:文件夹 SAN(St ...

  3. Java泛型中extends和super的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  4. Center OS 7安装 Apollo

    声明: 每个人的情况都不一样,所以大家在看教程的时候自行斟酌,最好先扫一遍,再来根据自身情况进行操作.同时,遇到的问题也可能不尽相同,要灵活处理. 了解: Apollo是从原始ActiveMQ的基础构 ...

  5. lib 和 dll 的区别、生成以及使用详解 ~~包含示例代码~~(转)

    原文章地址:https://www.cnblogs.com/TenosDoIt/p/3203137.html#c 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方 ...

  6. 防HTTP慢速攻击的nginx安全配置

    概述   慢速攻击,是一种ddos攻击的变体版本.通常来说,它通过向服务器发送正常的请求,只不过请求的头或者请求体的内容特别长,发送速度有特别慢,这样每一个连接占用的时间就会变得特别长,攻击者会在短时 ...

  7. 微信小程序学习之navigate(1)navigateTo方法与navigateBack方法对于page生命周期不同的触发影响

    小程序的每个页面都有一些生命周期,每个生命周期由分别有着不同的生命周期钩子函数.而我们的业务逻辑写在这些生命周期的钩子函数中,那么弄清楚那种情形下会触发那些生命周期钩子函数就非常重要了 先上一段代码 ...

  8. thinlphp配置加载

    在ThinkPHP中,一般来说应用的配置文件是自动加载的,加载的顺序是: 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置-> ...

  9. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

  10. Python内置的一个用于命令项选项与参数解析的模块argparse

    一.argparse简单使用 我们先来看一个简单示例.主要有三个步骤: 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() ...