悬关,求调
查看原帖
悬关,求调
681941
OIer_Hhy楼主2024/7/14 13:54
#include<bits/stdc++.h>
#define endl '\n'
#define R(x) cin>>x
#define W(x) cout<<x
#define repA(i,e) for(int i=1;i<=e;i++)
#define repB(i,e) for(int i=e;i>=1;i--)
#define repC(i,s,e) for(int i=s;i<=e;i++)
#define repD(i,s,e) for(int i=s;i>=e;i--)
#define repE(i,s,e,t) for(int i=s;i<=e;i+=t)
#define repF(i,s,e,t) for(int i=s;i>=e;i-=t)
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e5+5;
int n,a,b,t;
int u,v,w;
int head[N],tot;
int vis[N];
string ans="NO";
struct edge{
	int to,w,nxt,cnt;
}e[M];
void addedge(int u,int v,int w){
	e[++tot].to=v;
	e[tot].w=w;
	e[tot].nxt=head[u];
	head[u]=tot;
}
inline void dfs(int u,ll x,bool f){
	if(ans=="YES") return;
	if(f){
		for(int i=1;i<=n;i++){
			if(i!=b){
				if(vis[i]>2) continue;
				vis[i]++;
				dfs(i,x,0);
				vis[i]--;
			}
		}
	}
	for(auto i=head[u];i;i=e[i].nxt){
		int v=e[i].to,w=e[i].w;
		if(v==b){
			if(x^w==0){
				ans="YES";
				return ;
			} 
			continue ;
		}
		if(vis[v]>2) continue ;
		vis[v]++;
		dfs(v,x^w,f);
		vis[v]--;
	}
}
inline void init(){
	ans="NO";
	for(int i=1;i<=tot;i++) e[i].nxt=e[i].to=e[i].w=e[i].cnt=0;
	for(int i=1;i<=n;i++) head[i]=vis[i]=0;
	tot=0;
}
inline void solve(){
	R(n);R(a);R(b);
	init();
	repA(i,n-1){
		R(u);R(v);R(w);
		addedge(v,u,w);
		addedge(u,v,w);
	}
	vis[a]=1;
	dfs(a,0ll,1);
	W(ans);
	cout<<endl;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	R(t);
	while(t--) solve();
	return 0;
}



2024/7/14 13:54
加载中...