Connected Graph POJ1737 高精度
来源:互联网 发布:如何看待纽约 知乎 编辑:程序博客网 时间:2024/06/01 10:06
题目链接
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) of vertices,u is reachable from v.You are to write a program that tries to calculate the number of different connected undirected graph with n vertices.For example,there are 4 different connected undirected graphs with 3 vertices.
Input
The input contains several test cases. Each test case contains an integer n, denoting the number of vertices. You may assume that 1<=n<=50. The last test case is followed by one zero.
Output
For each test case output the answer on a single line.
Sample Input
12340
Sample Output
11438
题意:
给你一个无向图,问你有多少种不同的方式使这个图连通.
思路:
n 最大是50, 所以这个题肯定会爆long long,所以需要高精度, 那么接下来就是如何计算答案了.
首先我们知道 ans[1] = ans[2] = 1;
n >= 3 时,我们考虑拿掉点 1 和点 2 的情况, 假设点 2 所在的连通块共 k 个点,这 k 个点与剩下的 n - k 个点分别处于一个连通块中, 共有ans[k] * ans[n-k] 种, 点 2 所在的连通块是需要从除去点 1 和点 2 剩下的点中选取 k-1 个点,则有C(n-2,k-1)种,而这 k 个点必须通过点 1 才能与点 1 所在的连通块相连,于是有2 ^k - 1 种,
所以答案为:
代码:
#include <algorithm>#include <cassert>#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <vector>#include <cmath>using namespace std;struct BigInteger { typedef unsigned long long LL; static const int BASE = 100000000; static const int WIDTH = 8; vector<int> s; BigInteger& clean(){while(!s.back()&&s.size()>1)s.pop_back(); return *this;} BigInteger(LL num = 0) {*this = num;} BigInteger(string s) {*this = s;} BigInteger& operator = (long long num) { s.clear(); do { s.push_back(num % BASE); num /= BASE; } while (num > 0); return *this; } BigInteger& operator = (const string& str) { s.clear(); int x, len = (str.length() - 1) / WIDTH + 1; for (int i = 0; i < len; i++) { int end = str.length() - i*WIDTH; int start = max(0, end - WIDTH); sscanf(str.substr(start,end-start).c_str(), "%d", &x); s.push_back(x); } return (*this).clean(); } BigInteger operator + (const BigInteger& b) const { BigInteger c; c.s.clear(); for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= s.size() && i >= b.s.size()) break; int x = g; if (i < s.size()) x += s[i]; if (i < b.s.size()) x += b.s[i]; c.s.push_back(x % BASE); g = x / BASE; } return c; } BigInteger operator - (const BigInteger& b) const { assert(b <= *this); // 减数不能大于被减数 BigInteger c; c.s.clear(); for (int i = 0, g = 0; ; i++) { if (g == 0 && i >= s.size() && i >= b.s.size()) break; int x = s[i] + g; if (i < b.s.size()) x -= b.s[i]; if (x < 0) {g = -1; x += BASE;} else g = 0; c.s.push_back(x); } return c.clean(); } BigInteger operator * (const BigInteger& b) const { int i, j; LL g; vector<LL> v(s.size()+b.s.size(), 0); BigInteger c; c.s.clear(); for(i=0;i<s.size();i++) for(j=0;j<b.s.size();j++) v[i+j]+=LL(s[i])*b.s[j]; for (i = 0, g = 0; ; i++) { if (g ==0 && i >= v.size()) break; LL x = v[i] + g; c.s.push_back(x % BASE); g = x / BASE; } return c.clean(); } BigInteger operator / (const BigInteger& b) const { assert(b > 0); // 除数必须大于0 BigInteger c = *this; // 商:主要是让c.s和(*this).s的vector一样大 BigInteger m; // 余数:初始化为0 for (int i = s.size()-1; i >= 0; i--) { m = m*BASE + s[i]; c.s[i] = bsearch(b, m); m -= b*c.s[i]; } return c.clean(); } BigInteger operator % (const BigInteger& b) const { //方法与除法相同 BigInteger c = *this; BigInteger m; for (int i = s.size()-1; i >= 0; i--) { m = m*BASE + s[i]; c.s[i] = bsearch(b, m); m -= b*c.s[i]; } return m; } // 二分法找出满足bx<=m的最大的x int bsearch(const BigInteger& b, const BigInteger& m) const{ int L = 0, R = BASE-1, x; while (1) { x = (L+R)>>1; if (b*x<=m) {if (b*(x+1)>m) return x; else L = x;} else R = x; } } BigInteger& operator += (const BigInteger& b) {*this = *this + b; return *this;} BigInteger& operator -= (const BigInteger& b) {*this = *this - b; return *this;} BigInteger& operator *= (const BigInteger& b) {*this = *this * b; return *this;} BigInteger& operator /= (const BigInteger& b) {*this = *this / b; return *this;} BigInteger& operator %= (const BigInteger& b) {*this = *this % b; return *this;} bool operator < (const BigInteger& b) const { if (s.size() != b.s.size()) return s.size() < b.s.size(); for (int i = s.size()-1; i >= 0; i--) if (s[i] != b.s[i]) return s[i] < b.s[i]; return false; } bool operator >(const BigInteger& b) const{return b < *this;} bool operator<=(const BigInteger& b) const{return !(b < *this);} bool operator>=(const BigInteger& b) const{return !(*this < b);} bool operator!=(const BigInteger& b) const{return b < *this || *this < b;} bool operator==(const BigInteger& b) const{return !(b < *this) && !(b > *this);}};ostream& operator << (ostream& out, const BigInteger& x) { out << x.s.back(); for (int i = x.s.size()-2; i >= 0; i--) { char buf[20]; sprintf(buf, "%08d", x.s[i]); for (int j = 0; j < strlen(buf); j++) out << buf[j]; } return out;}istream& operator >> (istream& in, BigInteger& x) { string s; if (!(in >> s)) return in; x = s; return in;}BigInteger ans[51],c[51][51];void init(){ for(int i = 1; i <= 50; ++i) c[i][0] = c[i][i] = 1; for(int i = 2; i <= 50; ++i) for(int j = 1; j < i; ++j) c[i][j] = c[i-1][j] + c[i-1][j-1]; ans[1] = ans[2] = 1; for(int i = 3; i <= 50; ++i){ for(int j = 1; j < i; ++j){ long long tmp = (pow(2,j)-1); ans[i] = ans[i] + ans[j] * ans[i-j]* c[i-2][j-1] * tmp; } }}int main(){ init(); int n; while(scanf("%d", &n) && n){ cout<<ans[n]<<endl; }}
阅读全文
0 0
- Connected Graph POJ1737 高精度
- poj1737 Connected Graph
- POJ1737 Connected Graph【数学】
- poj1737 Connected Graph(组合数学)
- poj 1737 Connected Graph 组合递推计数+高精度
- Connected Graph
- poj1737
- PKU1737 解题报告 Connected Graph __高精度加法,乘法,减法,组合数
- poj 1737 Connected Graph
- poj 1737 Connected Graph
- Nodally 3-connected graph
- POJ 1737 Connected Graph
- POJ 1737 Connected Graph
- Connected Component in Undirected Graph
- sicily connected components in undiected graph
- Sicily 1002. connected components in undirected graph
- POJ 1737 Connected Graph 递推
- POJ 1737 Connected Graph 题解(未完成)
- 软件架构设计-五视图方法论
- Eclipse常用快捷键及快捷键功能失效时的解决方案
- 指针 下:函数指针,函数指针数组,函数指针数组的指针,回调函数详解
- PHP常用函数整理
- opencv取消感兴趣区域
- Connected Graph POJ1737 高精度
- 知道这20个正则表达式,能让你少写1,000行代码
- 滴滴笔试-青蛙走地下迷宫问题
- Linux系统常用命令
- tomcat7在myeclipse中启动不了 出现严重: Error waiting for multi-thread deployment of directories to completehos
- 基于Socket的通信小实例
- B
- android studio一个编译时的bug
- PAC成本数据模型