您的位置:首页 > 其它

[luoguP2420] 让我们异或吧(dfs + 异或的性质)

2017-05-04 15:39 176 查看

传送门

 

因为异或满足结合律和交换律。

a^b^b=a

 

所以这个题直接求根节点到每个点路径上的异或值。

对于每组询问直接输出根到两个点的异或值的异或的值。

 

——代码

#include <cstdio>
#include <cstring>
#define MAXN 200001

using namespace std;

int n, m, cnt;
int head[MAXN], to[MAXN], val[MAXN], next[MAXN], dis[MAXN];
bool vis[MAXN];

inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt++;
}

inline void dfs(int u)
{
int i, v;;
vis[u] = 1;
for(i = head[u]; i != -1; i = next[i])
{
v = to[i];
if(!vis[v])
{
dis[v] = dis[u] ^ val[i];
dfs(v);
}
}
}

int main()
{
int i, x, y, z;
scanf("%d", &n);
memset(head, -1, sizeof(head));
for(i = 1; i < n; i++)
{
scanf("%d %d %d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
dfs(1);
scanf("%d", &m);
for(i = 1; i <= m; i++)
{
scanf("%d %d", &x, &y);
printf("%d\n", dis[x] ^ dis[y]);
}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: