树形dp纪念
来源:互联网 发布:水星家纺淘宝哪家店 编辑:程序博客网 时间:2024/05/29 16:55
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3003
# include <cstdio># include <iostream># include <set># include <map># include <vector># include <list># include <queue># include <stack># include <cstring># include <string># include <cstdlib># include <cmath># include <algorithm>using namespace std ;const int mod = 1e9 + 7 ;long long c [ 1100 ] [ 1100 ] ;void getC ( ){ for ( int i = 1 ; i <= 1000 ; i ++ ) c [ i ] [ 0 ] = 1 , c [ i ] [ i ] = 1 ; for ( int j = 1 ; j <= 1000 ; j ++ ) { for ( int i = j + 1 ; i <= 1000 ; i ++ ) c [ i ] [ j ] = ( c [ i - 1 ] [ j ] + c [ i - 1 ] [ j - 1 ] ) % mod ; }}bool froot [ 1100 ] ;struct Edge{ int v , next ;} edge [ 3000 ] ;int head [ 1100 ] ;int cnt ;void addedge ( int u , int v ){ edge [ cnt ] . v = v ; edge [ cnt ] . next = head [ u ] ; head [ u ] = cnt ++ ;}bool vis [ 1100 ] ;int num [ 1100 ] ;int getnum ( int u ){ vis [ u ] = 1 ; for ( int i = head [ u ] ; i != -1 ; i = edge [ i ] . next ) { int v = edge [ i ] . v ; if ( ! vis [ v ] ) { num [ u ] += getnum ( v ) ; } } return num [ u ] + 1 ;}long long per [ 1100 ] ;long long dfs ( int u ){ vis [ u ] = 1 ; int sum = num [ u ] ; for ( int i = head [ u ] ; i != -1 ; i = edge [ i ] . next ) { int v = edge [ i ] . v ; if ( ! vis [ v ] ) { per [ u ] = ( ( per [ u ] * dfs ( v ) ) % mod * c [ sum ] [ num [ v ] + 1 ] ) % mod ; sum = sum - num [ v ] - 1 ; } } return per [ u ] ;}int main ( ){ getC ( ) ; int t ; cin >> t ; for ( int z = 1 ; z <= t ; z ++ ) { cnt = 0 ; memset ( head , -1 , sizeof ( head ) ) ; memset ( froot , 0 , sizeof ( froot ) ) ; memset ( vis , 0 , sizeof ( vis ) ) ; memset ( num , 0 , sizeof ( num ) ) ; int n ; scanf ( "%d" , & n ) ; for ( int i = 1 ; i < n ; i ++ ) { int u , v ; scanf ( "%d%d" , & u , & v ) ; froot [ v ] = 1 ; addedge ( u , v ) ; } int root = 0 ; for ( int i = 1 ; i <= n ; i ++ ) if ( ! froot [ i ] ) { root = i ; break ; } getnum ( root ) ; for ( int i = 1; i <= n ; i ++ ) per [ i ] = 1 ; memset ( vis , 0 , sizeof ( vis ) ) ; cout << "Case " << z << ": " ; cout << dfs ( root ) << endl ; }}
- 树形dp纪念
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- 树形DP
- 树形DP
- 树形DP
- 树形dp
- 树形dp
- 树形dp
- 树形dp
- 树形DP
- 树形DP
- 树形DP
- 树形DP
- 结构体例题(一)
- /portmap-4.0-17.i386.rpm
- Struts2拦截器配置
- 佛说,是我们自己苦了自己
- LightOJ 1045 求N!的位数
- 树形dp纪念
- 让内层div将外层div撑开
- 初学者如何学习运维?
- Java乔晓松-oracle的条件查询和排序查询
- Struts 2框架的输入校验
- 《Effective Java》读书笔记09--谨慎地覆盖clone方法
- 第五次课堂作业
- Struts 2的拦截器机制
- 魔数卡牌