poj 1737男人八题之一 orz ltc
这是楼教主的男人八题之一。很高兴我能做八分之一的男人了。
题目大意:求有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的更多相关文章
- poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14874 Accepted: 5118 De ...
- poj 1741 楼教主男人八题之中的一个:树分治
http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...
- POJ1742 Coins(男人八题之一)
前言 大名鼎鼎的男人八题,终于见识了... 题面 http://poj.org/problem?id=1742 分析 § 1 多重背包 这很显然是一个完全背包问题,考虑转移方程: DP[i][j]表示 ...
- Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)
[POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ...
- poj 1742(好题,楼天城男人八题,混合背包)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 33269 Accepted: 11295 Descripti ...
- 博弈论(男人八题):POJ 1740 A New Stone Game
A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5694 Accepted: 3119 ...
- 新男人八题---AStringGame
终于完成进度男人1/8,为了这题学了sam= = 题意先有一个串,n个子串,两个人轮流每次在子串上加字符,要求加完后还是原串的子串,最后不能加的就是输者,求赢的人 解法:sam之后在构造的状态图上跑s ...
- nyoj137 取石子(三) 楼教主男人八题之一
思路:一堆时,N态.两堆时,当两堆数量相同,P态,不同为N态.三堆时,先手可以变成两堆一样的,必胜N态. 此时可以总结规律:堆数为偶数可能且石子数都是两两相同的,为P态.分析四堆时,当四堆中两两数量一 ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
随机推荐
- 21-Python-Django进阶补充篇
1. 路由部分补充 1.1 默认值 url: url(r'^index/', views.index, {'name': 'root'}), views: def index(request,name ...
- [LeetCode] Contains Duplicate II 包含重复值之二
Given an array of integers and an integer k, return true if and only if there are two distinct indic ...
- [LeetCode] Longest Palindromic Substring 最长回文串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- C#网络编程——IPHostEntry
using System; using System.Net; namespace study { class IPHostEntrySample { public static void func( ...
- WPF实现三星手机充电界面
GitHub地址:https://github.com/ptddqr/wpf-samsung-phone-s5-charging-ui/tree/master 先上效果图 这个效果来自于三星S5的充电 ...
- .net 单点登录实践
前言 最近轮到我在小组晨会来分享知识点,突然想到单点登录,准备来分享下如何实现单点登录,所以有了下文.实现方案以及代码可能写得不是很严谨,有漏洞的地方或者错误的地方欢迎大家指正. 刚开始头脑中没有思路 ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- GreenDao的使用
1.生成代码文件
- 篇三:MySQL分页
分页:物理分页.逻辑分页 物理分页:SQL语句中直接使用limit 逻辑分页:先查询出所有满足条件的数据,然后在Java中截取需要的行 优缺点: 1.逻辑分页翻页速度快,第一次查询出来的数据会有缓存, ...
- C# 扩展系统类方法
1.声明扩展方法的步骤:类必须是static,方法是static 2.第一个参数是被扩展的对象,前面标注this 3.使用扩展方法的时候必须保证扩展方法类已经在当前代码中using 例子:using ...