多校第七场 1011 hdu 5379 Mahjong tree(树形dp)

来源:互联网 发布:微信交友源码 编辑:程序博客网 时间:2024/06/14 09:32

AC代码:

#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <algorithm>#include <cstring>#include <vector>#define MAX 100007using namespace std;typedef long long LL;vector<int> e[MAX];const LL mod = 1e9+7;LL dp[MAX];LL fac[MAX];int t,n,x,y;void add ( int u , int v ){    e[u].push_back ( v );    e[v].push_back ( u );}void init ( ){    for ( int i = 0 ; i < MAX ; i++ )        e[i].clear();}void dfs ( int u , int p ){    int num = 0, total = 0;    dp[u] = 1;    for ( int i = 0 ; i < e[u].size() ; i++ )    {        int v = e[u][i];        if ( v == p ) continue;        else total++;        dfs ( v , u );        if ( e[v].size() == 1 ) num++;        dp[u] *= dp[v];        dp[u] %= mod;    }    if ( total == 0 ) return;    dp[u] *= fac[num];    dp[u] %= mod;    if ( total - num < 2 )    {        dp[u] *= 2LL;        dp[u] %= mod;    }    if ( total - num > 2 )        dp[u] = 0;}int main ( ){    scanf ( "%d" , &t );    fac[0] = 1;    for ( LL i = 1 ; i < MAX ; i++ )    {        fac[i] = fac[i-1]*i;        fac[i] %= mod;    }    int cc = 1;    while ( t-- )    {        init ();        scanf ( "%d" , &n );        for ( int i = 1 ; i < n ; i++ )        {           scanf ( "%d%d" , &x , &y );           add ( x , y );        }        dfs ( 1 , -1 );        printf ( "Case #%d: " , cc++ );        printf ( "%I64d\n" , dp[1] );    }}
0 0