dfs+哈希
①先对终点跑一遍dfs跑出终点到其他点所有的异或值。
②再从起点开始跑dfs,边dfs的同时边在哈希表中查找是否有相同的异或值,如有即表示可以传送到对应的点上,这样跑向终点x就一定为0了
这题卡unordered_set,用set反而可以过
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i = a;i<n;i++)
#define per(i,a,n) for(int i = n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define yes cout<<"YES"<<endl;
#define no cout<<"NO"<<endl;
#define endl '\n'
typedef vector<int> VI;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) {return mrand()%x;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(int a,int b){return a*b/gcd(a,b);}
const int N=200010;
int T,n,a,b;
bool ok;
set<int> st;
vector<vector<PII>> g;
void dfs1(int u,int fa,int wt){
for(auto [v,w]:g[u]){
if(v==fa) continue;
st.insert(wt^w);
dfs1(v,u,wt^w);
}
}
void dfs2(int u,int fa,int wt){
if((u==b&&wt==0)||(u!=b&&st.count(wt))){
ok=1;
return;
}
if(u==b&&wt!=0) return;
for(auto [v,w]:g[u]){
if(v==fa) continue;
dfs2(v,u,wt^w);
if(ok) return;
}
}
void solve(){
cin>>n>>a>>b;
g.resize(n+1);
g.clear();
rep(i,1,n){
int u,v,w;
cin>>u>>v>>w;
g[u].pb({v,w});
g[v].pb({u,w});
}
ok=0;
st.clear();
dfs1(b,-1,0);
dfs2(a,-1,0);
puts(ok?"YES":"NO");
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>T;
while(T--) solve();
return 0;
}
时间复杂度:O(nlogn)
空间复杂度:O(n)