# [HEOI2013]SAO

## 题目描述

Welcome to SAO ( Strange and Abnormal Online)。这是一个 VR MMORPG， 含有 n 个关卡。但是，挑战不同关卡的顺序是一个很大的问题。

## 输入输出样例

2
5
0 < 2
1 < 2
2 < 3
2 < 4
4
0 < 1
0 < 2
0 < 3

4
6

## 说明/提示

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 typedef long long ll;
7 struct Node
8 {
9     int next,to,w;
10 }edge[2001];
12 ll size[1005],f[1005][1005],Mod=1e9+7,C[1005][1005],F[1005];
13 void add(int x,int y,int w)
14 {
15     num++;
17     edge[num].to=y;
19     edge[num].w=w;
20 }
21 void dfs(int x)
22 {int i,p1,p3;
23     size[x]=1;f[x][1]=1;
24     vis[x]=1;
26     {
27         int v=edge[i].to;
28         if (vis[v]) continue;
29         dfs(v);
30         memcpy(F,f[x],sizeof(F));
31         memset(f[x],0,sizeof(f[x]));
32         if (edge[i].w==1)
33         {
34             for (p1=1;p1<=size[x];p1++)
35             for (p3=p1;p3<=p1+size[v]-1;p3++)
36             (f[x][p3]+=C[p3-1][p1-1]*C[size[x]+size[v]-p3][size[x]-p1]%Mod*F[p1]%Mod*(f[v][size[v]]-f[v][p3-p1]+Mod)%Mod)%=Mod;
37         }
38         else
39         {
40             for (p1=1;p1<=size[x];p1++)
41             for (p3=p1+1;p3<=p1+size[v];p3++)
42             (f[x][p3]+=C[p3-1][p1-1]*C[size[x]+size[v]-p3][size[x]-p1]%Mod*F[p1]%Mod*f[v][p3-p1]%Mod)%=Mod;
43         }
44         size[x]+=size[v];
45     }
46     for (i=1;i<=size[x];i++)
47     (f[x][i]+=f[x][i-1])%=Mod;
48 }
49 int main()
50 {int T,i,x,y,j;
51 char ch;
52     scanf("%d",&T);
53     C[0][0]=1;
54     for (i=1;i<=1000;i++)
55     {
56         C[i][0]=1;
57         for (j=1;j<=i;j++)
58          C[i][j]=(C[i-1][j-1]+C[i-1][j])%Mod;
59     }
60     while (T--)
61     {
62         scanf("%d",&n);
64         memset(edge,0,sizeof(edge));
65         memset(f,0,sizeof(f));
66         memset(vis,0,sizeof(vis));
67         num=0;
68         for (i=1;i<n;i++)
69         {
70             scanf("%d %c %d",&x,&ch,&y);
71             x++;y++;
78 }