poj1737 带标号连通图计数(DP)
2017-03-23 20:53
423 查看
时间限制:1秒 内存限制:128M
【问题描述】
统计有 n 个不同顶点的连通图有多少个,图的顶点有编号。如图上是 n=3 时的 4 种不同连通图的方案。
【输入格式】
输入包多组数据,每组数据仅一行一个整数n,表示标号图的顶点数目。
【输出格式】
对于每组数据输出一行,表示答案 mod 10^9+7 的结果。
【输入样例】
1
2
3
4
0
【输出样例】
1
1
4
38
【数据范围】
1<=n<=100
【来源】
poj1737(《大白书》112页)
要求连通图我们首先要知道一共有多少种图(因为这里的方法是先求不连通的图的个数),这个很好证明,我们每新加一个点n,它与前面的点有2^(n-1)种连法(就是与前面每个点连还是不连),所以有n个点的图一共有2^(n*(n-1)/2)种,这里的n*(n-1)/2是等差数列求和的公式得到的(从1加到n-1)。
我们设3个数组:
g[i]表示i个节点没连通的方案数。
d[i]表示i个节点连通的方案数。
h[i]表示i个节点的总方案数。
有了上面的铺垫我们就可以安心做这道题了,首先我们看到1号节点,假设与它连通的点有j个那么就有c(i-1,j-1)种选法来选出除了1号节点外的其他点。这j个点一共有d[j]种连法,然后剩下的i-j个点一共有h[i-j]种连法。
所以递推方程就出来了:g[i]={c[i-1,j-1]*d[j]*h[i-j]|1<=j<=i-1}.
我们可以先预处理h数组,其实也可以一边算一边处理。
代码如下:
#include<cstdlib> #include<cstdio> #include<cstring> #include<iostream> using namespace std; typedef long long ll; const int maxn=105; const ll mod=1000000007; ll d[maxn],c[maxn][maxn],h[maxn],g[maxn]; void ready() { for(int i=0;i<=100;i++) c[i][0]=1; for(int i=1;i<=100;i++) { for(int j=1;j<=i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } } } int main() { //freopen("A.in","r",stdin); //freopen("A.out","w",stdout); ready(); d[1]=1; g[1]=0; h[1]=1; int t=1; for(int i=2;i<=100;i++) { for(int j=1;j<=i-1;j++) { g[i]=(g[i]+(c[i-1][j-1]*d[j])%mod*h[i-j])%mod; } t=(2*t)%mod; h[i]=(t*h[i-1])%mod; d[i]=(h[i]-g[i]+mod)%mod; } int n; scanf("%d",&n); while(n) { printf("%d\n",d ); scanf("%d",&n); } return 0; }
相关文章推荐
- hdu5729 Rigid Frameworks(连通二分图计数dp)
- HDU 5729 Rigid Frameworks (连通二分图计数DP)
- HDU 5800 To My Girlfriend(计数DP)
- 2015年沈阳网赛 Jesus Is Here(DP中的计数问题)
- POJ3160 Father Christmas flymouse 强连通tarjan算法+dfs+简单dp
- 考研路茫茫 (双连通 树形dp)
- [HRBUST1472]Coin(dp,计数)
- 【bzoj1833】[ZJOI2010]count 数字计数 数位DP
- 2017多校第4场 HDU 6078 Wavel Sequence DP,计数
- 【BZOJ1030】[JSOI2007]文本生成器【AC自动机】【计数DP】
- 【矩阵优化连通性状压dp】哈密尔顿路径
- hdu 4363 Draw and paint(dp计数,5级)
- 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理
- 51 nod 1610 路径计数(Moblus+dp)
- [BZOJ4818][SDOI2017]序列计数(矩阵加速dp)
- HDU5000 Clone(计数dp)
- 【HDOJ6146】Pokémon GO(DP,计数)
- [bzoj1833][ZJOI2010]数字计数(数位DP)
- 【BZOJ3622】已经没有什么好害怕的了【计数DP】【姿势】
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)