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

题目大意:求有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. [笔记]ng2的webpack配置

    欢迎吐槽 前言 angular.cn教程中用的是systemjs加载器,那用webpack应该怎么配置呢?本文 demo: https://github.com/LeventZheng/angular ...

  2. [LeetCode] Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  3. [LeetCode] Word Ladder 词语阶梯

    Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...

  4. Anna-senpai帖子翻译与Mirai源代码使用

    Anna-senpai这个人太好玩了,整件事就像没有黄段子的无聊世界那样. 无聊翻译了一下,顺便实验了效果. --------------------------------------------- ...

  5. .NET MVC实现多图片上传并附带参数(ajaxfileupload)

    做网站呢,都免不了要做图片上传. 还记得去年做微信的时候用WebAPI+ajaxfileupload.js做了一个能够附带参数上传的功能,博文地址:.NET WebAPI 实现图片上传(包括附带参数上 ...

  6. sublimetext3中保存代码片段

    在日常的开发工作中,不断重复上一次敲过的代码,有时确实感到伐木累."蓝瘦"(难受)."香菇"(想哭),大概表达的也是这样的心境吧!:grinning: 所以,在 ...

  7. JAVA多线程的总结

    1-----------------------------------基本概念------------------------------------------------- (1)多线程:一个应 ...

  8. 框架dubbox的简单使用

    之前: RPC: Remote Produedure Call :一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议 SOA: Service-oriented architect ...

  9. Java处理 文件复制

    try { InputStream in = new FileInputStream(new File(oldPath)); OutputStream out = new FileOutputStre ...

  10. ISO