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; }
 
  |