[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]);
        }
    }

}

 

posted @ 2017-11-22 14:51  Elpsywk  阅读(436)  评论(0编辑  收藏  举报