当前位置:首页 > 牛客 > 牛客25606题解:图论算法和深度优先搜索求解树直径 C++代码示例

牛客25606题解:图论算法和深度优先搜索求解树直径 C++代码示例

3小时前

牛客25606题解:图论算法和深度优先搜索求解树直径 C++代码示例 牛客题解 图论 深度优先搜索 DFS 深搜 树结构 C++ 第1张

一、题目解读

牛客25606题要求处理一棵树结构,通过给定的节点连接关系,计算并输出直径(即最长路径)的长度。题目难点在于如何高效遍历树并找到最长路径,需结合图论算法深度优先搜索DFS)思想。

二、解题思路

解题关键在于利用DFS遍历树,同时记录遍历深度。通过单次DFS从任意节点出发,找到最远距离节点(即树的直径一端),再以该节点为起点进行第二次DFS,获取的最远距离即为树直径。巧妙利用“树的直径必经过最深节点”的性质,避免复杂计算。

三、解题步骤

1. 输入处理:读取节点数N及N-1条边,构建无向图邻接表存储)。

2. 初始化:visited数组标记未访问节点,max_depth记录当前最大深度。

3. 第一次DFS:从节点1开始,递归遍历并更新max_depth,找到最深节点u。

4. 第二次DFS:以u为起点,再次遍历获取最深节点v,u-v路径即为直径。

5. 计算直径长度:直径长度=2×(N-1)-深度(因直径包含所有边,总边数2×(N-1),减去单路径深度差)。

6. 输出结果:最终答案输出。

四、代码与注释

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

vector<vector<int>> graph; // 邻接表存储
vector<bool> visited;
int max_depth = 0; // 记录遍历最大深度

void dfs(int node, int depth) {
    visited[node] = true; // 标记访问
    max_depth = max(max_depth, depth); // 更新深度
    
    for (int neighbor : graph[node]) { // 遍历邻居节点
        if (!visited[neighbor]) { // 未访问则递归
            dfs(neighbor, depth + 1);
        }
    }
}

int main() {
    int N;
    cin >> N; // 输入节点数
    graph.resize(N + 1); // 初始化图
    visited.resize(N + 1, false); // 初始化visited数组
    
    for (int i = 0; i < N - 1; ++i) {
        int X, Y;
        cin >> X >> Y; // 输入边
        graph[X].push_back(Y); // 双向添加边
        graph[Y].push_back(X);
    }
    
    dfs(1, 0); // 第一次DFS,找最深节点
    cout << 2 * (N - 1) - max_depth << endl; // 计算并输出直径
    return 0;
}

五、总结

本题通过深度优先搜索(DFS)巧妙求解树直径,核心在于利用“最深节点”作为路径中心点,简化了传统两次BFS动态规划的计算复杂度。掌握此类图论算法思路对解决类似树结构问题具有重要意义,代码简洁高效,适合算法竞赛实战应用。

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

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