POJ1737 Connected Graph
2016-07-04 10:43
344 查看
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.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct bgnum{ int l; int a[600]; bgnum operator + (const bgnum &x) const{ bgnum ans; memset(ans.a,0,sizeof(ans.a)); int len=max(l,x.l); ans.l=1; for(int i=1;i<=len;i++){ ans.a[i]+=a[i]+x.a[i]; ans.a[i+1]+=ans.a[i]/10; ans.a[i]%=10; } len++; while(!ans.a[len]&&len)len--; ans.l=len; return ans; } bgnum operator - (const bgnum &x) const{ bgnum ans; memset(ans.a,0,sizeof(ans.a)); for(int i=1;i<=l;i++){ ans.a[i]+=a[i]-x.a[i]; if(ans.a[i]<0){ ans.a[i]+=10; ans.a[i-1]--; } } ans.l=l; while(!ans.a[ans.l] && ans.l) ans.l--; return ans; } bgnum operator * (const bgnum &x) const{ bgnum ans; memset(ans.a,0,sizeof(ans.a)); for(int i=1;i<=l;i++) for(int j=1;j<=x.l;j++){ ans.a[i+j-1]+=a[i]*x.a[j]; ans.a[i+j]+=ans.a[i+j-1]/10; ans.a[i+j-1]%=10; } int len=l+x.l; while(!ans.a[len] && len)len--; ans.l=len; return ans; } }f[60],//[i]个点构不同图的方案数 c[60][60],//[i]个点中选[j]个任意连边的方案数 mi[1600],//2的[i]次方 sum; void Print(bgnum p){ for(int i=p.l;i>=1;i--){ printf("%d",p.a[i]); } printf("\n"); return; } bgnum p1,p2; int main(){ p1.l=1;p1.a[1]=1;//高精度数1 p2.l=1;p2.a[1]=2;//高精度数2 int i,j; mi[0]=p1; for(i=1;i<=1250;i++) mi[i]=mi[i-1]*p2; for(i=0;i<=50;i++) c[i][0]=p1; for(i=1;i<=50;i++) for(j=1;j<=i;j++){ c[i][j]=c[i-1][j]+c[i-1][j-1];//组合数递推公式 } for(i=1;i<=50;i++){ sum.l=1; memset(sum.a,0,sizeof(sum.a)); for(j=1;j<i;j++){ sum=sum+(c[i-1][j-1]*f[j]*mi[(i-j)*(i-j-1)/2]); } // Print(sum); f[i]=mi[i*(i-1)/2]-sum; } int n; scanf("%d",&n); Print(f ); return 0; }View Code
再放隔壁某dalao的AC题解
http://blog.csdn.net/orion_rigel/article/details/51812864
相关文章推荐
- 表单中单选框添加选项和移除选项
- 团体程序设计天梯赛-练习集L1-022. 奇偶分家
- PHP读书笔记(7)- 函数
- [转]踢球装逼要诀!这个就厉害了!
- 点点点系列最少的程序架构
- Android之逐帧动画
- 使用Python学习selenium测试工具-1:Selenium的前生今世
- 获取上个月的日期
- C/C++代码覆盖率工具gcov、lcov
- 不同的二叉查找树 II
- C++ Builder 在指定目录下查找指定文件
- iOS之label添加下划线
- 差分近似图像导数算子之Sobel算子
- XZ_iOS之block封装代码块
- linux ssd 黑名单
- 第一次写博客,先练练手吧
- 小数据:理论和架构
- Hypertable源码解读之Hypertable.lib目录
- maven打包时,同时打包源码 Build a source-JAR from the current project.
- Spring + Spring MVC + MyBatis 整合