题目:
洛谷 P2420
分析:一种显然的想法是ans(u,v)=f[u] xor f[v] xor f[lca(u,v)] xor f[lca(u,v)];
显然后面两个等于0,直接等于f[u] xor f[v]。其中,f[x]表示x到根节点的路径异或值。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100005;
struct node{
int y,w,next;
}adge[maxn*2];
int f[maxn],vis[maxn],ls[maxn];
int n,m,i,u,v,cnt;
void add_adge(int u,int v,int w)
{
adge[++cnt].y=v; adge[cnt].w=w; adge[cnt].next=ls[u];ls[u]=cnt;
adge[++cnt].y=u; adge[cnt].w=w; adge[cnt].next=ls[v];ls[v]=cnt;
}
void dfs(int x)
{
int c;
for (c=ls[x];c>0;c=adge[c].next)
{
int y=adge[c].y;
if (vis[y]==0)
{
vis[y]=1;
f[y]=f[x]^adge[c].w;
dfs(y);
}
}
}
int main()
{
scanf("%d",&n);
for (i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_adge(u,v,w);
}
vis[1]=1;
dfs(1);
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&u,&v);
printf("%d\n",f[u]^f[v]);
}
}