树形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 ;    }}