一棵树 有n个点 可以删掉1-k-1条边
希望使得各部分的或异或和相等
分情况讨论:
1.所有数字异或和为0,则一定可以找到一个“分界点”
2.如果异或和为x(x!=0):
a.能发现大于等于3个异或和为k的连通分量 (k>=3时可以切出足够的块)
b.无法发现,不能分割出相同的连通分量
//cyc
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define mst(a) memset(a,0,sizeof a)
using namespace std;
typedef pair<int,int> pii;
/*
もう一回、もう一回!
*/
const int maxn=1e5+5;
const int maxp=1e6+5;
int a[maxn];
vector<int> vec[maxn];
int cnt;
int xsum;
int dfs(int u,int fa)
{
int ans=a[u];
for(int j:vec[u]){
if(j!=fa){
ans^=dfs(j,u);
}
}
if(ans==xsum){
ans=0;
cnt++;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int _;
cin>>_;
while(_--){
int k,n;
cin>>n>>k;
xsum=0;
cnt=0;
for(int i=1;i<=n;i++){
cin>>a[i];
vec[i].clear();
xsum^=a[i];
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
vec[u].pb(v);
vec[v].pb(u);
}
if(xsum==0){
cout<<"YES"<<endl;
continue;
}
dfs(1,0);
if(k>=3&&cnt>=3){
cout<<"YES"<<endl;
continue;
}
cout<<"NO"<<endl;
}
}