zoukankan      html  css  js  c++  java
  • 【洛谷P2420】让我们异或吧【DFS】

    题目大意:

    题目链接:https://www.luogu.org/problemnew/show/P2420
    给出一棵树,每条边有一个权值,输出指定点的路径异或值。


    思路:

    首先,这到题是我在想刷LCALCA的时候遇到的,结果这道标签是LCALCA的题目我却想不到为什们要用LCALCA,一个DFSDFS就可以过。
    其实要求两个点的路径异或值就是xor[root][x]xor[root][x]^xor[root][y]xor[root][y],因为重复的路径会被重复异或掉,就变成了0。
    一边DFSDFS就可以求出所有点到rootroot的路径异或值,然后就可以O(1)O(1)输出了。


    代码:

    #include <cstdio>
    #include <cstring>
    #define N 100100
    using namespace std;
    
    int n,m,tot,x,y,z,Xor[N],head[N];
    
    struct edge
    {
    	int next,to,dis;
    }e[N*2];
    
    void add(int from,int to,int dis)
    {
    	e[++tot].to=to;
    	e[tot].dis=dis;
    	e[tot].next=head[from];
    	head[from]=tot;
    }
    
    void dfs(int x,int fa,int k)
    {
    	Xor[x]=k;  //记录路径异或值
    	for (int i=head[x];~i;i=e[i].next)
    	 if (e[i].to!=fa)
    	  dfs(e[i].to,x,k^e[i].dis);
    }
    
    int main()
    {
    	memset(head,-1,sizeof(head));
    	scanf("%d",&n);
    	for (int i=1;i<n;i++)
    	{
    		scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z);
    		add(y,x,z);
    	}
    	dfs(1,0,0);
    	scanf("%d",&m);
    	while (m--)
    	{
    		scanf("%d%d",&x,&y);
    		printf("%d\n",Xor[x]^Xor[y]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    exkmp
    欧拉通路、回路
    你有多久没有看过星星
    trie树模板(统计难题)
    SPFA(热浪)
    codevs1958 刺激
    洛谷1290 欧几里得的游戏
    洛谷1016 旅行家的预算
    Spfa算法模板
    Tyvj2017清北冬令营入学测试
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998556.html
Copyright © 2011-2022 走看看