p11249 20pts求调
查看原帖
p11249 20pts求调
758242
qiang2013楼主2025/6/15 23:03

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));
	}
} 
2025/6/15 23:03
加载中...