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

Description

An undirected graph is a set V of vertices and a set of E∈{V*V} edges.An undirected graph is connected if and only if for every pair (u,v) of vertices,u is reachable from v.
You are to write a program that tries to calculate the number of different connected undirected graph with n vertices.

For example,there are 4 different connected undirected graphs with 3 vertices.

Input

The
input contains several test cases. Each test case contains an integer n,
denoting the number of vertices. You may assume that 1<=n<=50.
The last test case is followed by one zero.

Output

For each test case output the answer on a single line.

Sample Input

  1. 1
  2. 2
  3. 3
  4. 4
  5. 0

Sample Output

  1. 1
  2. 1
  3. 4
  4. 38

Source

 
 
 
n个点之间任取两点连边,按照组合数公式,共有$ C(n,2)=n*(n-1)/2 $条边可连
每条边可连可不练,所以总情况有 P=2^C(n,2) 种。
我们要求的是所有点都连通的情况数,可以用总数P减去不连通的情况数
设F[i]为i个点构成连通图的情况数,任取一点为基准,当与其构成连通图的点有j-1个时,共有F[j]种连通情况。则若在总图中有j个点一定连通,共有$C(i-1,j-1)*F[j] $种情况,而剩下的点可以随意连边,共有$2^C(i-j,2)$种情况。
若总点数为i,则答案为:$F[i]=P[i]-sum$;   sum=sum+(C(i-1,j-1)*F[j]*2^C(i-j,2))    {1<=j<i 累加求和}
 
然而高精度各种写不对,我选择死亡。
 
先放一张表
  1. INPUT:
  2. OUTPUT:
  3. INPUT:
  4. OUTPUT:
  5. INPUT:
  6. OUTPUT:
  7. INPUT:
  8. OUTPUT:
  9. INPUT:
  10. OUTPUT:
  11. INPUT:
  12. OUTPUT:
  13. INPUT:
  14. OUTPUT:
  15. INPUT:
  16. OUTPUT:
  17. INPUT:
  18. OUTPUT:
  19. INPUT:
  20. OUTPUT:
  21. INPUT:
  22. OUTPUT:
  23. INPUT:
  24. OUTPUT:
  25. INPUT:
  26. OUTPUT:
  27. INPUT:
  28. OUTPUT:
  29. INPUT:
  30. OUTPUT:
  31. INPUT:
  32. OUTPUT:
  33. INPUT:
  34. OUTPUT:
  35. INPUT:
  36. OUTPUT:
  37. INPUT:
  38. OUTPUT:
  39. INPUT:
  40. OUTPUT:
  41. INPUT:
  42. OUTPUT:
  43. INPUT:
  44. OUTPUT:
  45. INPUT:
  46. OUTPUT:
  47. INPUT:
  48. OUTPUT:
  49. INPUT:
  50. OUTPUT:
  51. INPUT:
  52. OUTPUT:
  53. INPUT:
  54. OUTPUT:
  55. INPUT:
  56. OUTPUT:
  57. INPUT:
  58. OUTPUT:
  59. INPUT:
  60. OUTPUT:
  61. INPUT:
  62. OUTPUT:
  63. INPUT:
  64. OUTPUT:
  65. INPUT:
  66. OUTPUT:
  67. INPUT:
  68. OUTPUT:
  69. INPUT:
  70. OUTPUT:
  71. INPUT:
  72. OUTPUT:
  73. INPUT:
  74. OUTPUT:
  75. INPUT:
  76. OUTPUT:
  77. INPUT:
  78. OUTPUT:
  79. INPUT:
  80. OUTPUT:
  81. INPUT:
  82. OUTPUT:
  83. INPUT:
  84. OUTPUT:
  85. INPUT:
  86. OUTPUT:
  87. INPUT:
  88. OUTPUT:
  89. INPUT:
  90. OUTPUT:
  91. INPUT:
  92. OUTPUT:
  93. INPUT:
  94. OUTPUT:
  95. INPUT:
  96. OUTPUT:
  97. INPUT:
  98. OUTPUT:
  99. INPUT:
  100. OUTPUT:

打表

然后是我一直改不对的代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. struct bgnum{
  8. int l;
  9. int a[];
  10. bgnum operator + (const bgnum &x) const{
  11. bgnum ans;
  12. memset(ans.a,,sizeof(ans.a));
  13. int len=max(l,x.l);
  14. ans.l=;
  15. for(int i=;i<=len;i++){
  16. ans.a[i]+=a[i]+x.a[i];
  17. ans.a[i+]+=ans.a[i]/;
  18. ans.a[i]%=;
  19.  
  20. }
  21. len++;
  22. while(!ans.a[len]&&len)len--;
  23. ans.l=len;
  24. return ans;
  25. }
  26. bgnum operator - (const bgnum &x) const{
  27. bgnum ans;
  28. memset(ans.a,,sizeof(ans.a));
  29. for(int i=;i<=l;i++){
  30. ans.a[i]+=a[i]-x.a[i];
  31. if(ans.a[i]<){
  32. ans.a[i]+=;
  33. ans.a[i-]--;
  34. }
  35. }
  36. ans.l=l;
  37. while(!ans.a[ans.l] && ans.l) ans.l--;
  38. return ans;
  39. }
  40. bgnum operator * (const bgnum &x) const{
  41. bgnum ans;
  42. memset(ans.a,,sizeof(ans.a));
  43. for(int i=;i<=l;i++)
  44. for(int j=;j<=x.l;j++){
  45. ans.a[i+j-]+=a[i]*x.a[j];
  46. ans.a[i+j]+=ans.a[i+j-]/;
  47. ans.a[i+j-]%=;
  48. }
  49. int len=l+x.l;
  50. while(!ans.a[len] && len)len--;
  51. ans.l=len;
  52. return ans;
  53. }
  54. }f[],//[i]个点构不同图的方案数
  55. c[][],//[i]个点中选[j]个任意连边的方案数
  56. mi[],//2的[i]次方
  57. sum;
  58.  
  59. void Print(bgnum p){
  60. for(int i=p.l;i>=;i--){
  61. printf("%d",p.a[i]);
  62. }
  63. printf("\n");
  64. return;
  65. }
  66. bgnum p1,p2;
  67. int main(){
  68. p1.l=;p1.a[]=;//高精度数1
  69. p2.l=;p2.a[]=;//高精度数2
  70. int i,j;
  71. mi[]=p1;
  72. for(i=;i<=;i++)
  73. mi[i]=mi[i-]*p2;
  74. for(i=;i<=;i++)
  75. c[i][]=p1;
  76. for(i=;i<=;i++)
  77. for(j=;j<=i;j++){
  78. c[i][j]=c[i-][j]+c[i-][j-];//组合数递推公式
  79. }
  80. for(i=;i<=;i++){
  81. sum.l=;
  82. memset(sum.a,,sizeof(sum.a));
  83. for(j=;j<i;j++){
  84. sum=sum+(c[i-][j-]*f[j]*mi[(i-j)*(i-j-)/]);
  85. }
  86. // Print(sum);
  87. f[i]=mi[i*(i-)/]-sum;
  88. }
  89. int n;
  90. scanf("%d",&n);
  91. Print(f[n]);
  92. return ;
  93. }

再放隔壁某dalao的AC题解

http://blog.csdn.net/orion_rigel/article/details/51812864

POJ1737 Connected Graph的更多相关文章

  1. 【Java】【高精度】【组合数】【递推】poj1737 Connected Graph

    http://blog.csdn.net/sdj222555/article/details/12453629 这个递推可以说是非常巧妙了. import java.util.*; import ja ...

  2. [poj1737]Connected Graph(连通图计数)

    题意:输出题中带有$n$个标号的图中连通图的个数. 解题关键: 令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数. 则$f(n) + g(n) = h(n)$ 考虑标 ...

  3. $Poj1737\ Connected\ Graph$ 计数类$DP$

    AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...

  4. poj 1737 Connected Graph

    // poj 1737 Connected Graph // // 题目大意: // // 带标号的连通分量计数 // // 解题思路: // // 设f(n)为连通图的数量,g(n)为非连通图的数量 ...

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

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

  6. Connected Graph

    Connected Graph 求n个点的无向联通图数量,\(n\leq 50\). 解 直接无向联通图做状态等于是以边点做考虑,难以去重,考虑联通对立面即不联通. 不难求出n个点的总方案数为\(2^ ...

  7. 【poj1737】 Connected Graph

    http://poj.org/problem?id=1737 (题目链接) 题意 求n个节点的无向连通图的方案数,不取模w(゚Д゚)w Solution 刚开始想了个第二类斯特林数,然而并不知道怎么求 ...

  8. POJ 1737 Connected Graph(高精度+DP递推)

    题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...

  9. POJ 1737 Connected Graph (大数+递推)

    题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单(无重边无自环)连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS ...

随机推荐

  1. 关于eclipse入门开发c/c++文章推荐

    1. 关于编译说明. http://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/ 2. 关于快捷键与代码阅读 http://www.cn ...

  2. iOS获取窗口当前显示的控制器

    解决类似网易新闻客户端收到新闻推送后,弹出一个UIAlert,然后跳转到新闻详情页面这种需求 1.提供一个UIView的分类方法,这个方法通过响应者链条获取view所在的控制器 - (UIViewCo ...

  3. 13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问

    这篇文章要实现的功能是:在一个Action中,有些业务方法只能是post提交上来的才能执行,有些方法是只能get提交上来的才能执行. 比如上篇文章中的UserAction.java(代码如下) pac ...

  4. 【转】【C#】在 Windows 窗体 DataGridView 单元格中承载控件

    using System; using System.Windows.Forms; public class CalendarColumn : DataGridViewColumn { public ...

  5. 如何免费访问Google?

    访问Google方法(以Mac为例) 1.替换hosts文件中的内容,文件链接如下: https://github.com/racaljk/hosts 2.下载Google浏览器,链接如下: http ...

  6. 公钥(Public Key)与私钥(Private Key)

    公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分.公钥通常用于加密会话密钥.验证数字签 ...

  7. XML CDATA的作用

    操作XML文件时,如果允许用户输入内容,例如∶"< ".">"."/".""等,当生成XML时,会破坏了XM ...

  8. 『方案』《女友十年精华》 ORC 图片 文字识别 详解

    目的需求: 2008年,遇到一本电子书 <女友十年精华> 觉得很美,想 私藏 这些文章: >网络搜索文章 —— 没有找到: >反编译程序 —— 所有文字 都是图片格式(部分文章 ...

  9. IOS判断app在appstore是否有可用的更新

    iTunes可以提供app的版本信息,主要通过appid获取,如 http://itunes.apple.com/lookup?id=946449501,使用时只需要到iTunes查找自己的appid ...

  10. linux网络命令

    关键字 write wall last lastlog traceroute netstat mount 1.write 该命令可以给所有在线用户发送消息 示例: 接受消息用户:按回车可以退出 2.w ...