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 - 1) * f(k) * 2 ^ (2, n - k))。

根据此递推方程计算即可。

考虑到数值结果非常大,用java内置大数。

http://poj.org/problem?id=1737

 1 package sample_java_project;
 2
 3 import java.math.BigInteger;
 4 import java.util.Scanner;
 5
 6 public class myfirstjava{
 7     public static BigInteger f[] = new BigInteger [55];
 8     public static BigInteger c[][] = new BigInteger [55][55];
 9     public static BigInteger power[] = new BigInteger [55];
10     public static void main(String[] args){
11         init();
12         int n;
13         Scanner cin = new Scanner(System.in);
14         while(cin.hasNext()){
15             n = cin.nextInt();
16             if(n == 0) break;
17             System.out.println(F(n));
18         }
19     }
20
21     public static void init(){
22         power[0] = BigInteger.ONE;
23         for(int i = 1; i < 51; i++) power[i] = power[i - 1].multiply(BigInteger.valueOf(2));
24         for(int i = 0; i < 55; i++) for(int j = 0; j < 55; j++) c[i][j] = BigInteger.valueOf(-1);
25         for(int i = 0; i < 55; i++) f[i] = BigInteger.valueOf(-1);
26     }
27
28     public static BigInteger C(int k, int num){
29         if(c[k][num] != BigInteger.valueOf(-1)) return c[k][num];
30         if(k > num) return BigInteger.ZERO;
31         if(k == 0 || k == num) return BigInteger.ONE;
32         return c[k][num] = C(k - 1, num - 1).add(C(k, num - 1));
33     }
34
35     public static BigInteger power(BigInteger num){
36         BigInteger ans = BigInteger.valueOf(1);
37         while(num != BigInteger.ZERO){
38             ans = ans.multiply(BigInteger.valueOf(2));
39             num = num.subtract(BigInteger.ONE);
40         }
41         return ans;
42     }
43
44     public static BigInteger F(int num){
45         if(f[num] != BigInteger.valueOf(-1)) return f[num];
46         BigInteger tem = BigInteger.ZERO;
47         for(int i = 1; i < num; i++)
48             tem = tem.add((F(i).multiply(power(C(2, num - i)))).multiply(C(i - 1, num - 1)));
49         return f[num] = power(C(2, num)).subtract(tem);
50     }
51 }

时间: 2024-10-08 19:34:57

poj1737 Connected Graph的相关文章

【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[

$Poj1737\ Connected\ Graph$ 计数类$DP$

AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问题,以便于执行递推. 一个连通图不容易划分,而一个不连通的无向图则很容易划分成结点更少的两部分.所以我们把问题转化成用$N$个点的无向图总个数减去$N$个点的不连通无向图的个数. $N$个点的无向图总个数显然是$2^{N*(N-1)/2}$,还是简单说下叭,就是$N$个点连成完全图的边数显然是$N*(N-1)

【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 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

// 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所在的连通图数

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个节点连通

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 (大数+递推)

题目链接: 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\)