链接:C. Bakry and Partitioning.
思路:a^a=0,dfs找出子树异或和等于sum的个数。
int t,n,k;
int a[100010],b[100010],f[100010];
vector<int >c[100010];
int ans,sum;
void dfs(int u)
{
f[u]=1;
for(int i=0;i<c[u].size();i++)
{
if(f[c[u][i]]==0)
{
dfs(c[u][i]);
if(b[c[u][i]]!=sum)b[u]=b[u]^b[c[u][i]];
}
}
if(b[u]==sum)ans++;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
ans=0;sum=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i],b[i]=a[i],c[i].clear();
sum=sum^a[i];f[i]=0;
}
for(int i=1;i<n;i++)
{
int u,v;cin>>u>>v;
c[u].push_back(v);
c[v].push_back(u);
}
if(sum==0){cout<<"YES\n";continue;}
if(k==2){cout<<"NO\n";continue;}
dfs(1);
if(ans==1)cout<<"NO\n";
else cout<<"YES\n";
}
return 0;
}