您的位置:首页 > 其它

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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: