查看: 23|回复: 0

牛客25606题解:DFS计算树结构最优解

[复制链接]
  • TA的每日心情
    无聊
    昨天 10:23
  • 签到天数: 52 天

    [LV.5]常住居民I

    51

    主题

    0

    回帖

    86

    积分

    注册会员

    Rank: 2

    积分
    86
    发表于 前天 09:35 | 显示全部楼层 |阅读模式
    一、问题理解

    牛客25606题要求我们计算树结构中的最优解,这个问题可以转化为寻找树的最长路径(直径)问题。通过DFS遍历树结构,我们可以高效地解决这类典型的图论问题。

    二、算法核心思想
    • ‌树结构表示‌:使用邻接表存储树
    • ‌DFS遍历‌:深度优先搜索计算最大深度
    • ‌公式推导‌:利用数学公式2*(N-1)-max_depth得出结果

    三、完整代码实现(带注释)
    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;

    4. vector<vector<int>> graph;
    5. vector<bool> visited;
    6. int max_depth = 0;

    7. void dfs(int node, int depth) {
    8.     visited[node] = true;
    9.     max_depth = max(max_depth, depth);
    10.    
    11.     for (int neighbor : graph[node]) {
    12.         if (!visited[neighbor]) {
    13.             dfs(neighbor, depth + 1);
    14.         }
    15.     }
    16. }

    17. int main() {
    18.     int N;
    19.     cin >> N;
    20.     graph.resize(N + 1);
    21.     visited.resize(N + 1, false);
    22.    
    23.     for (int i = 0; i < N - 1; ++i) {
    24.         int X, Y;
    25.         cin >> X >> Y;
    26.         graph[X].push_back(Y);
    27.         graph[Y].push_back(X);
    28.     }
    29.    
    30.     dfs(1, 0);
    31.     cout << 2 * (N - 1) - max_depth << endl;
    32.     return 0;
    33. }
    复制代码


    关键知识点
    • ‌邻接表‌:高效存储树结构的数据结构
    • DFS算法‌:深度优先搜索的基本原理
    • 递归实现‌:DFS的递归实现方式
    • ‌树的性质‌:树是无向无环连通


    来源:牛客25606题解:DFS计算树结构最优解

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表