本人双非铜牌选手,入坑ACM6个月,目前板刷CF来提升自己的算法能力和代码实现能力,欢迎关注我一起刷题QwQ。本人CF账号
tag:DFS,贪心,前缀异或和
problem types:判断题
题意转换:从起点跑一遍的前缀异或和和从重点跑一遍的前缀异或和相等即可。注意从起点跑不能经过终点。
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define int long long
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
typedef pair<int, int> PII;
const int N = 1e5 + 10;
int n, a, b;
int e[N * 2], ne[N * 2], h[N], w[N * 2], idx;
int cnt[N], cnt2[N];
map<int, bool> mp;
void add(int a, int b, int c){
e[idx] = b; ne[idx] = h[a]; w[idx] = c; h[a] = idx++;
}
void dfs(int u, int fa, bool flag){
if(u == b) flag = true;
for(int i = h[u]; ~i; i = ne[i]){
int j = e[i];
if(j == fa) continue;
if(!flag)
cnt[j] = cnt[u] ^ w[i];
else
cnt[j] = -1;
dfs(j, u, flag);
}
}
void dfs2(int u, int fa){
for(int i = h[u]; ~i; i = ne[i]){
int j = e[i];
if(j == fa) continue;
cnt2[j] = cnt2[u] ^ w[i];
dfs2(j, u);
}
}
void solve(){
//try it again.
cin >> n >> a >> b;
idx = 0; mp.clear();
rep(i, 1, n) h[i] = -1;
rep(i, 1, n - 1){
int a, b, c; cin >> a >> b >> c;
add(a, b, c); add(b, a, c);
}
cnt[a] = 0; cnt2[b] = 0;
dfs(a, 0, false);
dfs2(b, 0);
rep(i, 1, n){
if(i == b) continue;
mp[cnt2[i]] = true;
}
rep(i, 1, n){
if(i == b || cnt[i] == -1) continue;
if(mp[cnt[i]]){
cout << "YES\n";
return;
}
}
cout << "NO\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
cin >> t;
while(t--)
solve();
}