传送门

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int N=100005;int x,y,z;
 6 int n,m,k=0,head[N],dis[N];bool vis[N];
 7 struct node{int to,next,w;}edge[N<<1];
 8 //无向图存边数组开两倍 
 9 void add(int u,int v,int w){
10     edge[++k].to=v;edge[k].next=head[u];edge[k].w=w;head[u]=k;
11 }
12 void dfs(int now,int val){
13     //dis[tmp]^dis[tmp]^dis[u]^dis[v]=dis[u]^dis[v]
14     //所以只要求每一个和根节点的异或值就可以了 
15     dis[now]=val;vis[now]=true;
16     //now到根节点的异或边权即为val
17     //这个点已经找过了 
18     for(register int i=head[now];i;i=edge[i].next){
19         //从这个点所在的图的边的起点开始向后找 
20         if(!vis[edge[i].to]) dfs(edge[i].to,val^edge[i].w);
21         //如果在这个没有搜过,就顺着向下搜,异或值就是现在的^要走过的 
22     }
23 }
24 int main(){
25     scanf("%d",&n);
26     for(register int i=1;i<=n-1;i++){
27         scanf("%d%d%d",&x,&y,&z);
28         add(x,y,z);add(y,x,z);
29     }
30     dfs(1,0);/*从根节点开始找,根节点和自己的异或值就是零*/scanf("%d",&m);
31     for(register int i=1;i<=m;i++){
32         scanf("%d%d",&x,&y);
33         printf("%d\n",dis[x]^dis[y]);
34     } 
35 }

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。      
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄