//teja349 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //setbase - cout << setbase (16); cout << 100 << endl; Prints 64 //setfill - cout << setfill ('x') << setw (5); cout << 77 << endl; prints xxx77 //setprecision - cout << setprecision (14) << f << endl; Prints x.xxxx //cout.precision(x) cout<=b;i--) #define pb push_back #define mp make_pair #define vi vector< int > #define vl vector< ll > #define ss second #define ff first #define ll long long #define pii pair< int,int > #define pll pair< ll,ll > #define sz(a) a.size() #define inf (1000*1000*1000+5) #define all(a) a.begin(),a.end() #define tri pair #define vii vector #define vll vector #define viii vector #define mod (1000*1000*1000+7) #define pqueue priority_queue< int > #define pdqueue priority_queue< int,vi ,greater< int > > #define flush fflush(stdout) #define primeDEN 727999983 mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // find_by_order() // order_of_key typedef tree< int, null_type, less, rb_tree_tag, tree_order_statistics_node_update> ordered_set; vector adj(12345); int subtree[1234],what[1234]; int dp[123][123][123][3]; int dp1[123][123][3]; int dfs(int cur,int par){ int i; subtree[cur]=1; int u; int pos,nex; int one,zer,two,inzer,inone,intwo,inlef,lef; rep(i,adj[cur].size()){ if(adj[cur][i]!=par){ dfs(adj[cur][i],cur); } } dp[cur][0][0][2]=1; dp[cur][0][1][1]=1; dp[cur][1][0][0]=1; rep(i,adj[cur].size()){ if(adj[cur][i]==par) continue; u=adj[cur][i]; fd(zer,subtree[cur],0){ lef=subtree[cur]-zer; fd(one,lef,0){ two=lef-one; rep(inzer,subtree[u]+1){ if(inzer+zer>what[0]) break; inlef=subtree[u]-inzer; rep(inone,inlef+1){ if(inone+one>what[1]) break; intwo=inlef-inone; if(intwo+two>what[2]) continue; rep(pos,3){ rep(nex,3){ if(abs(pos-nex)==2) continue; if(!dp[u][inzer][inone][nex] || !dp[cur][zer][one][pos]) continue; dp1[zer+inzer][inone+one][pos]=1; } } } } } } subtree[cur]+=subtree[u]; rep(zer,subtree[cur]+1){ lef=subtree[cur]-zer; rep(one,lef+1){ rep(pos,3){ dp[cur][zer][one][pos]=dp1[zer][one][pos]; dp1[zer][one][pos]=0; } } } } return 0; } int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); int t; cin>>t; while(t--){ int n; cin>>n; int i,j,k,pos; set seti; int val; rep(i,n+2){ rep(j,n+2){ rep(k,n+2){ rep(pos,3){ dp[i][j][k][pos]=0; } } } } rep(i,4){ what[i]=0; } rep(i,n){ adj[i].clear(); } rep(i,n){ cin>>val; what[val]++; } int u,v; rep(i,n-1){ cin>>u>>v; u--; v--; adj[u].pb(v); adj[v].pb(u); } rep(i,3){ if(what[i]) seti.insert(i); } if(seti.size()==1){ cout<<0<