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 84 85 86 87
| const int N = 1e5 + 86; int t, n, k, a[N], xo[N], x, c, b, flag; vector<int> v[N];
int dfs(int now, int fa) { xo[now] = a[now]; for (auto it : v[now]) { if (it == fa) continue; xo[now] ^= dfs(it, now); } return xo[now]; }
void fi(int now, int fa) { for (auto it : v[now]) { if (it == fa) continue; fi(it, now); if (xo[it] == x && flag == 0) { flag = 1; v[now].erase(find(v[now].begin(), v[now].end(), it)); return; } } }
int main() { ios::sync_with_stdio(false); cin.tie(0); t = io.xint(); f(sb, 1, t) { x = 0; n = io.xint(); k = io.xint(); f(i, 1, n) { a[i] = io.xint(); x ^= a[i]; v[i].clear(); } f(i, 1, n - 1) { c = io.xint(); b = io.xint(); v[c].pb(b); v[b].pb(c); } if (x == 0) { io.wstring("YES\n"); continue; } else if (k == 2) { io.wstring("NO\n"); continue; } flag = 0; dfs(1, 1); fi(1, 1); if (flag == 1) { flag = 0; dfs(1, 1); fi(1, 1); if (flag == 1) io.wstring("YES\n"); else io.wstring("NO\n"); continue; } io.wstring("NO\n"); } return 0; }
|