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

题目大意:求有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. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

  2. codevs 3110 二叉堆练习3

    3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...

  3. 微信H5中的一些坑

    最近在写微信公众号H5页面 遇到了一些坑,在这里记录一下 记录一下signature的计算 // 首先找到hex_sha1的加密算法,ticket 是后端提供的 var url_local = loc ...

  4. [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  5. [LeetCode] Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  6. 学习ASP.NET 5和MVC6

    今天很荣幸的参加了微软开源跨平台讲座,充分认识了下一个版本的ASP.NET所带来的激动人心的特性.虽然过去已经断断续续的了解了一些ASP.NET5和MVC6与EF7的动态,但是都没有这一次来的系统化( ...

  7. 在mysql 查询语句中将时间戳格式转化为年月日格式

    SELECT  FROM_UNIXTIME('时间戳的字段名称', '%Y-%m-%d %H:%i:%s')   FROM `表名` http://www.cnblogs.com/tdalcn/arc ...

  8. 关于闭包(closure)的一些概念

    和其他大多数现代编程语言一样,JS也采用词法作用域,也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.为了实现这种词法作用域,JS函数对象的内部状态不仅包含 ...

  9. Leetcode 69. Sqrt(x)

    Implement int sqrt(int x). 思路: Binary Search class Solution(object): def mySqrt(self, x): "&quo ...

  10. git的详细说明文档

    http://www.ihref.com/read-16369.html fork 后如何保持同步 http://www.tuicool.com/articles/6vayqen git clone ...