题解 p2420 让我们异或吧

时间:2023-03-09 16:18:47
题解 p2420 让我们异或吧

传送门

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 ;int x,y,z;
 ,head[N],dis[N];bool vis[N];
 ];
 //无向图存边数组开两倍
 void add(int u,int v,int w){
     edge[++k].to=v;edge[k].next=head[u];edge[k].w=w;head[u]=k;
 }
 void dfs(int now,int val){
     //dis[tmp]^dis[tmp]^dis[u]^dis[v]=dis[u]^dis[v]
     //所以只要求每一个和根节点的异或值就可以了
     dis[now]=val;vis[now]=true;
     //now到根节点的异或边权即为val
     //这个点已经找过了
     for(register int i=head[now];i;i=edge[i].next){
         //从这个点所在的图的边的起点开始向后找
         if(!vis[edge[i].to]) dfs(edge[i].to,val^edge[i].w);
         //如果在这个没有搜过,就顺着向下搜,异或值就是现在的^要走过的
     }
 }
 int main(){
     scanf("%d",&n);
     ;i<=n-;i++){
         scanf("%d%d%d",&x,&y,&z);
         add(x,y,z);add(y,x,z);
     }
     dfs(,);/*从根节点开始找,根节点和自己的异或值就是零*/scanf("%d",&m);
     ;i<=m;i++){
         scanf("%d%d",&x,&y);
         printf("%d\n",dis[x]^dis[y]);
     }
 }