hdu5379(2015 멀티 스쿨7)--Mahjong tree(구조+dfs)
제목의 대의: n개의 노드를 가진 나무를 제시한다. 1의 노드는 뿌리이다. 현재 1부터 n까지 n개의 수를 각 노드에 놓고 각 하위 나무의 숫자는 연속적이며 같은 부 노드의 노드 숫자는 연속적이다. 몇 가지가 있느냐고 묻는다.
만약에 하나의 노드 u에 대해 말하자면 하위 노드vi수가sum이면 하위 노드는num이고 sum-num>2라면 구조될 수 없으며,sum-num==2이면 방안은 dp[u]=∏dp[vi]*(num!),만약 2보다 작으면 방안은 dp[u] = ∏dp[vi]* (num!)*2 잔액을 주의하다
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define maxn 100010
#define LL __int64
const int Mod = 1e9+7 ;
struct node{
int v , next ;
}edge[maxn<<1] ;
int head[maxn] , cnt ;
int leaf[maxn] , flag ;
LL s[maxn] , dp[maxn] ;
void add(int u,int v) {
edge[cnt].v = v ; edge[cnt].next = head[u] ;
head[u] = cnt++ ;
}
void dfs(int u,int fa) {
int i , v , num = 0 , sum = 0 ;
dp[u] = leaf[u] = 1 ;
for(i = head[u] ; i != -1 ; i = edge[i].next) {
v = edge[i].v ;
if( v == fa ) continue ;
leaf[u] = 0 ;
dfs(v,u) ;
dp[u] = dp[u]*dp[v]%Mod ;
sum++ ;
if( leaf[v] ) num++ ;
}
if( sum == 0 ) return ;
if( sum-num > 2 ) flag = 1 ;
if( sum-num == 2 )
dp[u] = dp[u]*s[num]%Mod ;
else
dp[u] = dp[u]*s[num]*2%Mod ;
}
int main() {
int t , step = 0 ;
int n , i , j , u , v ;
s[0] = 1 ;
for(i = 1 ; i <= 100000 ; i++)
s[i] = s[i-1]*i%Mod ;
scanf("%d", &t) ;
while( t-- ) {
scanf("%d", &n) ;
memset(head,-1,sizeof(head)) ;
cnt = 0 ;
for(i = 1; i < n ; i++) {
scanf("%d %d", &u, &v) ;
add(u,v) ;
add(v,u) ;
}
flag = 0 ;
dfs(1,-1) ;
if( flag ) dp[1] = 0 ;
printf("Case #%d: %I64d
", ++step, dp[1]) ;
}
return 0 ;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.