zoukankan      html  css  js  c++  java
  • poj1737

    题意:给定n,问有n个点的连通图有多少种,每个点是不同的。

    分析:求出有n个点的图有多少种,求出不连通的有多少种,相减即可。求有n个点的不连通图时,枚举第n个点所在的连通分支有几个点,有k个点的话,除去第n点,还要选k-1个点,有C(n - 1, k -1)种选法。剩余n-k个点,这n-k个点随意构图,每两点间要么有边,要么没边,两种选择。有2^C(n-k,2)种情况。则用C(n - 1, k -1)乘以2^C(n-k,2)再乘以k个点构成连通图的情况总数,这样规模为n的问题转化为规模为k的子问题。dp处理即可。

    View Code
    import java.io.*;
    import java.util.*;
    import java.math.*;

    public class Main {
    static public BigInteger cal(int n, int k) {
    BigInteger ret = new BigInteger("1");
    for (int i = n; i > n - k; i--)
    ret = ret.multiply(BigInteger.valueOf(i));
    for (int i = 1; i <= k; i++)
    ret = ret.divide(BigInteger.valueOf(i));
    return ret;
    }

    static public void main(String[] args) {
    BigInteger a[] = new BigInteger[51];
    a[1] = new BigInteger("1");
    for (int i = 2; i <= 50; i++) {
    a[i] = new BigInteger("0");
    for (int j = 1; j < i; j++) {
    a[i] = a[i].add(a[j].multiply(cal(i - 1, j - 1).multiply(
    new BigInteger("2").pow((i - j) * (i - j - 1) / 2))));
    }
    a[i] = new BigInteger("2").pow(i * (i - 1) / 2).subtract(a[i]);
    }
    Scanner cin = new Scanner(new BufferedInputStream(System.in));
    while (cin.hasNext())
    {
    int x = cin.nextInt();
    if (x == 0)
    return;
    System.out.println(a[x]);
    }
    }
    }

  • 相关阅读:
    SpringBoot-14-MyBatis预热篇,MySQL小结
    SpringBoot-13-插曲之Node文件重命名+自动生成json对象
    八月十九风雨大作
    诉世书
    《仪式》
    珊瑚墓地
    新生
    《应龙》
    《枝·你是树的狂舞》
    golang中使用etcd
  • 原文地址:https://www.cnblogs.com/rainydays/p/2196617.html
Copyright © 2011-2022 走看看