p11249 20pts求调awa
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
int v, id;
};
vector<node> g[N];
int a[N], d[N];
bool vis[N];
queue<int> q, q2;
int main() {
int t;
cin >> t;
while(t--) {
int n, st = -1;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(a[i] == 1 && q.empty())
st = i,q.push(i);
}
if(st == -1) {
cout << "Yes\n";
continue;
}
int cnt = 0;
for(node i : g[q.front()]) ++cnt;
if(cnt > 2) {
cout << "No\n";
continue;
}
for(int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
d[x]++;d[y]++;
g[x].push_back({y, i});
g[y].push_back({x, i});
}
for(int i = 1; i <= n; i++) {
if(d[i] == 1 && a[i] == 0)q2.push(i);
}
while(!q2.empty()) {
int ct = q2.front();q2.pop();
for(node i : g[ct]) {
if(vis[i.id] == 0 && a[i.v] == 0) q2.push(i.v);
vis[i.id] = true;
}
}
bool flag = false;
while(!q.empty()) {
int ct = q.front();q.pop();
int num = 0;
for(node i : g[ct]) {
if(vis[i.id] == true) continue;
vis[i.id] = true;q.push(i.v);++num;
}
if(num > 1 && st != ct) {
cout << "No\n";
flag = true;
break;
}
}
if(!flag) cout << "Yes\n";
while(!q.empty()) q.pop();
for(int i = 1; i <= n; i++) {
g[i].clear();
}
memset(vis, 0, sizeof(vis));
}
}