zoukankan      html  css  js  c++  java
  • [poj1737]Connected Graph(连通图计数)

    题意:输出题中带有$n$个标号的图中连通图的个数。

    解题关键:

    令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数。

    则$f(n) + g(n) = h(n)$

    考虑标号1所在的联通分量中连通图的个数。

    转移方程:$g(n) = sumlimits_{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]);
            }
        }
    
    }
  • 相关阅读:
    容器的注册
    context创建过程解析(三)之deployDirectories
    context创建过程解析(二)之deployWARs
    Redis数据类型
    Kafka常用命令
    使用Charles抓包微信小程序
    DO、DTO、BO、AO、VO、POJO定义
    主题样式之鼠标点击效果
    Mysql常用命令
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7879203.html
Copyright © 2011-2022 走看看