这是楼教主的男人八题之一。很高兴我能做八分之一的男人了。

题目大意:求有n个顶点的连通图有多少个。

解法:

1、  用总数减去不联通的图(网上说可以,我觉得时间悬)

2、    用动态规划(数学递推)。网上讲的方法我觉得非常难懂,但好像也没有更好的表示。我就说一下吧:

用dp[i]表示i个顶点时的连通图的总数。

考虑将1号点去除后,2号点所在的联通块。设此联通块有k个点,则这块共有C(n-2,k-1)种取法。

回过头来看刚开始的图。可以把图分成两块,一是上述联通块,其余的另一块(此块也一定联通),这两块之间至少有一条连线,而这些线段肯定有一个顶点是1号点(用反证法很容易得到)。K个顶点连线到1号点的情况总共有2^k种,去除一种都不连的情况,还剩(2^k)-1种。故此时共有dp[j]*dp[i-j]*((2^k)-1)*C(n-2,k-1)

综上,dp[i]=sigma{ dp[j]*dp[i-j]*((2^k)-1)*C(n-2,k-1)} (1<=j<i)

最后提醒一句,虽然大家都知道:要用高精度

代码:

#include<cstdio>

#include<cstring>

using namespace std;

int max(int x,int y){

return(x>y)?x:y;

}

struct bign{

int len,p[240];

bign(){

len=1;

memset(p,0,sizeof(p));

}

bign operator =(const bign &o){

len=o.len;

memcpy(p,o.p,sizeof(p));

return *this;

}

bign operator +(const bign &o){

bign ans;

ans.len=max(len,o.len)+1;

int g=0;

for(int i=0;i<ans.len;i++){

int x=p[i]+o.p[i]+g;

ans.p[i]=x%10000;

g=x/10000;

}

if(ans.p[ans.len-1]==0)ans.len--;

return ans;

}

bign operator *(const bign &o){

bign ans;

ans.len=len+o.len;

for(int i=0;i<len;i++)

for(int j=0;j<o.len;j++){

ans.p[i+j]+=p[i]*o.p[j];

ans.p[i+j+1]+=ans.p[i+j]/10000;

ans.p[i+j]%=10000;

}

while(ans.p[ans.len-1]==0)ans.len--;

return ans;

}

void print(){

printf("%d",p[len-1]);

for(int i=len-2;i>=0;i--){

if(p[i]<10)printf("000%d",p[i]);

if(p[i]>=10 && p[i]<100)printf("00%d",p[i]);

if(p[i]>=100 && p[i]<1000)printf("0%d",p[i]);

if(p[i]>=1000 && p[i]<10000)printf("%d",p[i]);

}

printf("\n");

return;

}

}dp[51],tmp,c[51][51],two[51];

void init(bign &x){

x.len=1;

memset(x.p,0,sizeof(x.p));

x.p[0]=1;

return;

}

int main(){

int n;

scanf("%d",&n);

init(two[0]);

for(int i=1;i<=50;i++)

two[i]=two[i-1]+two[i-1];

for(int i=0;i<=50;i++)

two[i].p[0]--;

init(c[0][0]);

for(int i=1;i<=50;i++){

init(c[i][0]);init(c[i][i]);

for(int j=1;j<i;j++)

c[i][j]=c[i-1][j]+c[i-1][j-1];

}

init(dp[2]);init(dp[1]);

for(int i=3;i<=50;i++){

for(int j=1;j<i;j++)

dp[i]=dp[i]+dp[j]*dp[i-j]*two[j]*c[i-2][j-1];

}

while(n!=0){

dp[n].print();

scanf("%d",&n);

}

return 0;

}

poj 1737男人八题之一 orz ltc的更多相关文章

  1. poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14874   Accepted: 5118 De ...

  2. poj 1741 楼教主男人八题之中的一个:树分治

    http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...

  3. POJ1742 Coins(男人八题之一)

    前言 大名鼎鼎的男人八题,终于见识了... 题面 http://poj.org/problem?id=1742 分析 § 1 多重背包 这很显然是一个完全背包问题,考虑转移方程: DP[i][j]表示 ...

  4. Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)

    [POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ...

  5. poj 1742(好题,楼天城男人八题,混合背包)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33269   Accepted: 11295 Descripti ...

  6. 博弈论(男人八题):POJ 1740 A New Stone Game

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5694   Accepted: 3119 ...

  7. 新男人八题---AStringGame

    终于完成进度男人1/8,为了这题学了sam= = 题意先有一个串,n个子串,两个人轮流每次在子串上加字符,要求加完后还是原串的子串,最后不能加的就是输者,求赢的人 解法:sam之后在构造的状态图上跑s ...

  8. nyoj137 取石子(三) 楼教主男人八题之一

    思路:一堆时,N态.两堆时,当两堆数量相同,P态,不同为N态.三堆时,先手可以变成两堆一样的,必胜N态. 此时可以总结规律:堆数为偶数可能且石子数都是两两相同的,为P态.分析四堆时,当四堆中两两数量一 ...

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

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

随机推荐

  1. [原]在GeoServer中为OpenStreetMap数据设置OSM样式

    转载请注明作者think8848和出处(http://think8848.cnblogs.com) 在前面几篇文章中,我们讲到了部署Postgresql,部署PostGis,部署GeoServer以及 ...

  2. [网站性能1]对.net系统架构改造的一点经验和教训

    文章来源:http://www.admin10000.com/document/2111.html 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案,这不仅仅是因为 ...

  3. neo4j-jersey分嵌入式和服务式连接图形数据库

    原文载自:http://blog.csdn.net/yidian815/article/details/12887259 嵌入式: 引入neo4j依赖 <dependency> <g ...

  4. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  5. Mysql数据库 - 增删改

    一. Create 1. 单条插入, sql格式: insert into (列名) values(列值); INSERT INTO test.tch_teacher ( Sex, BId, NO, ...

  6. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

  7. 开启A20线(部分译)

    开启A20线 在查看或编写操作系统内核时一定会遇到A20线这个问题.本人对此一直都是似懂非懂的,查了些资料,决定弄明白于是有了这篇文章.其中前一部分是翻译一篇外国博文,但光有这篇文章依旧不能清楚地说明 ...

  8. 架构师养成记--12.Concurrent工具类CyclicBarrier和CountDownLatch

    java.util.concurrent.CyclicBarrier 一组线程共同等待,直到达到一个公共屏障点. 举个栗子,百米赛跑中,所有运动员都要等其他运动员都准备好后才能一起跑(假如没有发令员) ...

  9. JFinalConfig配置

    package com.sandu.common.config; import com.jfinal.config.Constants; import com.jfinal.config.Handle ...

  10. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...