[poj1737]Connected Graph(连通图计数)
题意:输出题中带有$n$个标号的图中连通图的个数。
解题关键:
令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数。
则$f(n) + g(n) = h(n)$
考虑标号1所在的联通分量中连通图的个数。
转移方程:$g(n) = \sum\limits_{k = 1}^{n - 1} {C_{n - 1}^{k - 1}f(k)h(n - k)} $
$h(n) = \frac{{n(n - 1)}}{2}$
import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { BigInteger h[]=new BigInteger [55],C[][]=new BigInteger[55][55]; C[0][0]=BigInteger.ONE; for(int i=0;i<=50;i++){//预处理组合数 C[i][0]=C[i][i]=BigInteger.ONE; for(int j=1;j<i;j++){ C[i][j]=C[i-1][j].add(C[i-1][j-1]); } } for(int i=1;i<=50;i++) h[i]=BigInteger.valueOf(2).pow(i*(i-1)/2); BigInteger f[]=new BigInteger[55],g[]=new BigInteger[55]; f[1]=BigInteger.ONE; for(int i=1;i<=50;i++) { g[i]=BigInteger.ZERO; for(int j=1;j<i;j++) { g[i]=g[i].add(C[i-1][j-1].multiply(f[j]).multiply(h[i-j])); } f[i]=h[i].subtract(g[i]); } Scanner in=new Scanner(System.in); while(in.hasNext()){ int n=in.nextInt(); if(n==0) break; System.out.println(f[n]); } } }