题目概述
给出一棵
n
个节点的树,每条边都有边权。再给出
解题报告
看洛谷讨论无意中看到这道题,一点进来发现竟然是道水题,于是水了博客QAQ。
树上路径肯定是LCA,但是由于是异或,会发现并没有必要……只需要认为询问是 x→root ,然后 root→y 就可以了,因为重复的那一段异或两次就会变为 0 <script type="math/tex" id="MathJax-Element-6">0</script> 从而没有贡献。
示例程序
#include<cstdio>
using namespace std;
const int maxn=100000;
int n,te,sum[maxn+5];
int E,lnk[maxn+5],son[maxn*2+5],nxt[maxn*2+5],w[maxn*2+5];
inline void Add(int x,int y,int z) {son[++E]=y;w[E]=z;nxt[E]=lnk[x];lnk[x]=E;}
void Dfs(int x,int fa=0)
{
for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa)
sum[son[j]]=sum[x]^w[j],Dfs(son[j],x);
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d",&n);
for (int i=1,x,y,z;i<n;i++) scanf("%d%d%d",&x,&y,&z),Add(x,y,z),Add(y,x,z);Dfs(1);
for (scanf("%d",&te);te;te--) {int x,y;scanf("%d%d",&x,&y);printf("%d\n",sum[x]^sum[y]);}
return 0;
}