1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <bits/stdc++.h> using namespace std; const int maxn=1005; int n,k,a[maxn]; vector<int> g[maxn]; bool ok,exist; int tot,res,cnt[maxn]; int dfn,l[maxn],r[maxn],node[maxn],big[maxn],siz[maxn]; void add(int u) { if(~a[u]) { if(!cnt[a[u]]) { if(a[u]<k) res--; if(a[u]==k) exist=1; } cnt[a[u]]++; } else tot++; } void del(int u) { if(~a[u]) cnt[a[u]]--; } void dfs0(int u,int fa) { l[u]=++dfn; node[dfn]=u; siz[u]=1; for(auto v:g[u]) { if(v==fa) continue; dfs0(v,u); siz[u]+=siz[v]; if(!big[u]||siz[big[u]]<siz[v]) big[u]=v; } r[u]=dfn; } void dfs1(int u,int fa,bool keep) { for(auto v:g[u]) { if(v!=fa&&v!=big[u]) dfs1(v,u,0); } if(big[u]) dfs1(big[u],u,1); for(auto v:g[u]) if(v!=fa&&v!=big[u]) { for(int i=l[v];i<=r[v];i++) add(node[i]); } add(u); if(!exist&&((res==1&&tot==1)||(res==0&&tot<=1))) ok=1; if(!keep) { for(int i=l[u];i<=r[u];i++) del(node[i]); tot=exist=0,res=k; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t;cin>>t; while(t--) { cin>>n>>k; dfn=ok=exist=0,res=k; for(int i=1;i<=n;i++) big[i]=0; for(int i=1;i<=n;i++) g[i].clear(); for(int i=2;i<=n;i++) { int x;cin>>x; g[x].push_back(i),g[i].push_back(x); } for(int i=1;i<=n;i++) cin>>a[i]; dfs0(1,0); dfs1(1,0,0); cout<<(ok?"Alice":"Bob")<<'\n'; } return 0; }
|