poj 1737 Connected Graph

//    poj 1737 Connected Graph
//
//    题目大意:
//
//        带标号的连通分量计数
//
//    解题思路:
//
//        设f(n)为连通图的数量,g(n)为非连通图的数量,h(n)为所有的
//    图的数量,h(n) = 2 ^(n * (n - 1) / 2);
//        f(n) + g[n] = h(n).
//
//        考虑标号为1在哪个连通分量内,设连通分量内有k个点,则问题为
//    在n-1个点中选择k-1个点的方法数 C(n-1,k-1),此时1所在的连通图数
//    为f(k),另一部分为n-k个点的图的所有数量,因为此时已经设了1所在
//    的连通图和剩余部分已经是不连通了,则
//    g(n) = sigma(C(n-1,k-1)*f(k)*h(n-k)){ 1<= k <= n-1}
//    f[n] = h[n] - g[n];

import java.util.*;
import java.io.*;
import java.math.BigInteger;

class Main{
    public static void main(String[] args){
        final int MAX_N = 55;

        BigInteger[][] C = new BigInteger[MAX_N][MAX_N];

        BigInteger[] f = new BigInteger[MAX_N];
        BigInteger[] g = new BigInteger[MAX_N];
        BigInteger[] h = new BigInteger[MAX_N];

        C[0][0] = new BigInteger("1");

        for (int i=1;i<MAX_N;i++){

            C[i][0] = C[i][i] = new BigInteger("1");

            for (int j=1;j<i;j++){
                C[i][j] = new BigInteger("0");
                C[i][j] = C[i][j].add(C[i-1][j]);
                C[i][j] = C[i][j].add(C[i-1][j-1]);
            }
        }

        for (int i=1;i<MAX_N;i++){
            h[i] = new BigInteger("2");
            h[i] = h[i].pow(i*(i-1)/2);
        }
        f[0] = h[0] = new BigInteger("1");
        for (int i=1;i<MAX_N;i++){
            g[i] = new BigInteger("0");

            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 sc = new Scanner(System.in);
        while(sc.hasNextInt()){

            int x = sc.nextInt();
            if (x==0)
                break;
            System.out.println(f[x]);
        }

    }
}
时间: 2024-10-08 05:04:09

poj 1737 Connected Graph的相关文章

POJ 1737 Connected Graph 题解(未完成)

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)

POJ 1737 Connected Graph (大数+递推)

题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS. http://oeis.org/A001187 但不支持这样做.TAT 间接做. 总方案数减去不合法方案. 因为\(n\)个点的完全图有 \(C(n,2)={n(n-1) \over 2}\) 条边,显然就有 \(2^{C(n,2)}\) 种子图,即枚举每条边是否选择. 设$ f[i]$ 表示每个点都和点 \(1\)

POJ 1737 Connected Graph 递推

题目大意:求n个点能组成多少种无向连通图 多年的老心病终于干掉了- - 令f[i]表示i个点能组成多少种无向图 首先易知我们能生成2^(i*(i-1)/2)种图 但是一些是不合法的 我们要将不合法的干掉 枚举1号节点与多少个点连通 设1号节点所在联通块大小为j(1<=j<=i-1) 那么与1相连的其它点有C(i-1,j-1)中选法,1号节点所在联通块有f[j]种连法,不与1号节点相连的点有2^((i-j)*(i-j-1)/2)种连法 故得到递推式f[i]=2^(i*(i-1)/2)-Σ[1&l

【POJ 1737】Connected Graph

Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3010   Accepted: 1481 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)

【POJ 1419】Graph Coloring

[POJ 1419]Graph Coloring 求图的最大独立集 最大独立集=补图最大团 很适合理解最大团/最大独立集的模板题 建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利 代码如下: #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <vecto

Connected Graph

Connected Graph 求n个点的无向联通图数量,\(n\leq 50\). 解 直接无向联通图做状态等于是以边点做考虑,难以去重,考虑联通对立面即不联通. 不难求出n个点的总方案数为\(2^{\frac{n\times (n-1)}{2}}\),所以设\(f_i\)表示n个点的无向联通图个数,因此我们有 \[f_i=2^{\frac{n(n-1)}{2}}-\sum_{j=1}^{i-1}f_jC_i^j2^{\frac{(i-j)(i-j-1)}{2}}\] 但是这样的转移存在重复,

【poj1737】 Connected Graph

http://poj.org/problem?id=1737 (题目链接) 题意 求n个节点的无向连通图的方案数,不取模w(?Д?)w Solution 刚开始想了个第二类斯特林数,然而并不知道怎么求具体方案,于是翻了题解.. 设${f_n}$表示n个节点的方案数. 那么n个节点所能够构成的无向图,无论连不连通,一共有${\frac{n*(n+1)}{2}}$条边,于是就有${2^{\frac{n*(n+1)}{2}}}$种图.考虑如何减去不连通的图的方案数. 我们选择枚举1号节点与i个节点连通

poj1737 Connected Graph

题目意思就不赘述了. 这是一个计数问题,一开始考虑如何去重却没有想到可行的办法. 原因是只考虑计数连通的方案数是困难的. 设n阶图连通的方案数为f(n),不连通的方案数为g(n) = 2^(2, n) - f(n). 不连通的图存在多于1个的连通分量,而每个连通分量是连通的,这是本题的切入点. 考虑点1所在的连通分量,设其节点数为k(< n),那么所求即等价于计数剩余(n - k)个节点连通或不连通方案数. 可以枚举从1到n - 1枚举k,如此有g(n) = sigma((k - 1, n -

【Java】【高精度】【组合数】【递推】poj1737 Connected Graph

http://blog.csdn.net/sdj222555/article/details/12453629 这个递推可以说是非常巧妙了. import java.util.*; import java.io.*; import java.math.*; public class Main{ static BigInteger[] g=new BigInteger[60]; static BigInteger[] f=new BigInteger[60]; static BigInteger[