当前位置:首页 > 洛谷 > 洛谷P2420题解析:树结构异或路径的高效求解算法

洛谷P2420题解析:树结构异或路径的高效求解算法

6小时前

洛谷P2420题解析:树结构异或路径的高效求解算法 洛谷题解 异或运算 树结构 DFS 图论应用 第1张

一、题目解读

洛谷P2420题要求处理一棵上的路径异或问题。给定一棵包含N个节点的树,每条边有权值,需回答M次查询:求节点u到节点v路径上所有边权值的异或和。题目关键在于如何高效利用树结构异或运算的性质,避免重复计算,从而在O(N+M)时间内完成预处理和查询。

二、解题思路

核心思想是通过一次深度优先搜索DFS)预处理每个节点到根节点的异或值,并存储于xor_val数组。由于路径异或值可分解为起点到根与终点到根的异或差,查询时直接异或两节点值即可。关键在于利用异或的“自逆性”(A^B^B = A)简化路径计算,避免遍历边。

三、解题步骤

1. 建树:通过输入构建邻接表存储树结构,每条边双向存储。

2. 预处理:从根节点1开始DFS,递归计算每个节点的xor_val,更新方式为当前路径异或值^边权值。

3. 查询处理:每次查询(u,v),直接输出xor_val[u] ^ xor_val[v],即为路径异或和。

四、代码与注释

#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 1e5 + 5; // 最大节点数

struct Edge {
    int to, w; // 边指向的节点和权值
};

vector<Edge> tree[MAXN]; // 邻接表存储树结构
int xor_val[MAXN]; // 节点到根节点的异或值
bool visited[MAXN]; // 标记节点是否访问

// DFS预处理每个节点的异或值
void dfs(int u, int current_xor) {
    visited[u] = true; // 标记访问
    xor_val[u] = current_xor; // 更新当前节点值
    
    for (const Edge& e : tree[u]) { // 遍历邻接边
        if (!visited[e.to]) { // 未访问的子节点递归
            dfs(e.to, current_xor ^ e.w); // 传递异或值:当前值^边权
        }
    }
}

int main() {
    ios::sync_with_stdio(false); // 加快IO
    cin.tie(nullptr);
    
    int N; cin >> N; // 节点数
    for (int i = 1; i < N; ++i) { // 构建树
        int u, v, w; cin >> u >> v >> w;
        tree[u].push_back({v, w}); // 双向边
        tree[v].push_back({u, w});
    }
    
    dfs(1, 0); // 从根节点开始预处理,初始异或为0
    
    int M; cin >> M; // 查询次数
    while (M--) {
        int u, v; cin >> u >> v;
        cout << (xor_val[u] ^ xor_val[v]) << '\n'; // 直接异或输出结果
    }
    return 0;
}

五、总结

本解法巧妙利用树结构和异或运算的数学特性,通过预处理降低查询复杂度。关键点在于:

1. 异或运算的可分解性(A→B路径 = A→根 ^ B→根)。

2. 单次DFS遍历即可完成所有节点信息的预处理。

算法在时间和空间效率上均满足题目要求,是解决树路径异或问题的经典模板。

原创内容 转载请注明出处

分享给朋友:

相关文章

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

一、题目解读括号树问题(洛谷P5658)要求处理一个由括号序列转化的树结构:每个节点表示一个括号,'('为子节点,')'为父节点。题目给定一棵n个节点的树,需计算每个节...

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

一、题目解读洛谷P2190题要求解决铁路售票系统中的车厢数量计算问题。题目给定n个车站和m条订票申请,每条申请包含区间[x,y)及乘客数z。需要计算在不超载的情况下(每节车厢最多36人),满足所有乘客...

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

一、题目解读洛谷P1121题要求求解环形数组的最大子段和,即在一个环形数组中找到一个连续子段,使其元素和最大。环形数组的特殊性在于首尾元素可相连,需考虑线性子段与跨越首尾的环形子段两种情况。二、解题思...

洛谷P3694题解:动态规划与状态压缩优化解题全解析

洛谷P3694题解:动态规划与状态压缩优化解题全解析

一、题目解读洛谷P3694题要求解决一个多团队人数分配问题,给定n个元素和m个团队,每个元素属于一个团队,需将元素重新排列,使相邻元素属于不同团队,并最小化调整次数。题目难点在于如何高效处理团队间的空...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

一、题目解读洛谷P3393题要求在一个包含N个城市和M条双向道路的图中,求解从起点1到终点N的最小花费路径。图中存在僵尸城市(僵尸无法通过)和危险城市(由僵尸城市扩散S步后标记),需要避开所有危险城市...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。