添加链接描述
从一点到两个a,b直接的路程异或公共路径会被异或相消
所以本质就是路径上的点异或前缀,从一点开始得到每个点的异或前缀,从当前路径开始又可以推断出相同路径相消,所以本质就是前缀和查询
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long//2的64次方 注意开ull
const int N=5e5+9;
int e[N],ne[N],h[N],w[N],idx;
void add(int a,int b,int c){
w[++idx]=c;//新版链式前向星
e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
int vis[N];
int sum[N];
void bfs(int u){
queue<int>q;
q.push(u);
while(q.size()){
auto x=q.front();
q.pop();
for(int i=h[x];i;i=ne[i]){
int j=e[i];
if(vis[j])continue;
vis[j]=1;
sum[j]=sum[x]^w[i];
q.push(j);
}
}
}
signed main(){
int n,q;
cin>>n>>q;
for(int i=1;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
bfs(1);
while(q--){
int a,b,c;
cin>>a>>b>>c;
if((sum[a]^sum[b])==c){
cout<<"YES\n";
}
else cout<<"No\n";
}
return 0;
}