lca T on#4求调
查看原帖
lca T on#4求调
836448
stylus楼主2024/11/7 17:59
#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x){
	x=0;bool f=0;char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-')f=1;
		ch=getchar();
	}do{x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}while(ch>='0'&&ch<='9');
	x=f?-x:x;
}
int t,n,x,y,d[100001][17],dp[100001],a[100001],tj,tjp,i1,i2;
vector<int>v[100001];
void dfs(int x,int f){
	dp[x]=dp[f]+1;
	d[x][0]=f;
	for(int i=1;(1<<i)<=dp[x];i++)d[x][i]=d[d[x][i-1]][i-1];
	for(int i:v[x])if(i!=f)dfs(i,x);
}
int lca(int x,int y){
	if(dp[x]<dp[y])swap(x,y);
	for(int i=17;i>=0;i--)
		if(dp[x]-(1<<i)>=dp[y]){
			x=d[x][i];
			if(a[x])tj++;
		}
	if(x==y)return x;
	for(int i=17;i>=0;i--)
		if(d[x][i]!=d[y][i]){
			x=d[x][i],y=d[y][i];
			if(a[x])tj++;
			if(a[y])tj++;
		}
	if(a[d[x][0]])tj++;
	return d[x][0];
}
signed main(){
	read(t);
	while(t--){
		read(n),tj=tjp=i1=i2=0;
		memset(d,0,sizeof(d)),memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)read(a[i]),v[i].clear(),tjp+=a[i];
		for(int i=1;i<n;i++)read(x),read(y),v[x].push_back(y),v[t].push_back(x);
		if(tjp==1)cout<<"Yes\n";
		else {
			dfs(1,1);
			for(int i=1;i<=n;i++){
				if(a[i]){
					if(dp[i]<dp[i1])i1=i;
					else if(dp[i]<dp[i2])i2=i;
				}
			}tj=2,lca(i1,i2);
			if(tj!=tjp)cout<<"No\n";
			else cout<<"Yes\n";
		}
	}
	return 0;
}
2024/11/7 17:59
加载中...