因为异或满足结合律和交换律。
a^b^b=a
所以这个题直接求根节点到每个点路径上的异或值。
对于每组询问直接输出根到两个点的异或值的异或的值。
——代码
1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 200001 4 5 using namespace std; 6 7 int n, m, cnt; 8 int head[MAXN], to[MAXN], val[MAXN], next[MAXN], dis[MAXN]; 9 bool vis[MAXN]; 10 11 inline void add(int x, int y, int z) 12 { 13 to[cnt] = y; 14 val[cnt] = z; 15 next[cnt] = head[x]; 16 head[x] = cnt++; 17 } 18 19 inline void dfs(int u) 20 { 21 int i, v;; 22 vis[u] = 1; 23 for(i = head[u]; i != -1; i = next[i]) 24 { 25 v = to[i]; 26 if(!vis[v]) 27 { 28 dis[v] = dis[u] ^ val[i]; 29 dfs(v); 30 } 31 } 32 } 33 34 int main() 35 { 36 int i, x, y, z; 37 scanf("%d", &n); 38 memset(head, -1, sizeof(head)); 39 for(i = 1; i < n; i++) 40 { 41 scanf("%d %d %d", &x, &y, &z); 42 add(x, y, z); 43 add(y, x, z); 44 } 45 dfs(1); 46 scanf("%d", &m); 47 for(i = 1; i <= m; i++) 48 { 49 scanf("%d %d", &x, &y); 50 printf("%d ", dis[x] ^ dis[y]); 51 } 52 return 0; 53 }