您的位置:首页 > 其它

洛谷 P2420 让我们异或吧 树形dp

2018-02-28 21:14 351 查看
题目:

洛谷 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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: