6130 树的最长路

思路:树的最长路问题可以通过两次 DFS 求解,具体思路如下:

1.第一次 DFS 求树的直径
以任意一个点为起点进行深度优先遍历(DFS),找到与该点距离最远的点 u 。
以 u 为起点进行 DFS ,找到与 u 距离最远的点 v 。
则从 u 到 v 的路径即为树的直径。

2.第二次 DFS 求每个结点的最远距离
从树的中心节点(即直径的中间节点)出发,分别给两侧 DFS ,对于经过的每个结点,记录其到直径长度的最大值。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+50;
int n,ans[maxn],dp[maxn][3],fa[maxn],son[maxn];
vector<int> G[maxn];
void dfs1(int x)
{
    dp[x][0]=dp[x][1]=dp[x][2]=-1e9;//初始化为负无穷 
    dp[x][0]=0;//直接更新就好 
    for (int i=0;i<G[x].size();i++)
    {
        int y=G[x][i];
        if (y==fa[x]) continue;
        fa[y]=x;
        dfs1(y);//处理儿子结点 
        int v=dp[y][0]+1;//v即为根到y的距离加1 
        if (v>dp[x][0])
        {
            dp[x][2]=dp[x][1];
            dp[x][1]=dp[x][0];
            dp[x][0]=v;
            son[x]=y;//记录最长链的末端 
        }
        else if (v>dp[x][1])
        {
            dp[x][2]=dp[x][1];
            dp[x][1]=v;
        }
        else if (v>dp[x][2]) dp[x][2]=v;
    }
}
void dfs2(int x,int len)//len是x到它父亲的距离 
{
    ans[x]=max(len,dp[x][0]);//更新答案 
    for (int i=0;i<G[x].size();i++)
    {
        int y=G[x][i];
        if (y==fa[x]) continue;
        dfs2(y,max(len+1,(y==son[x]?dp[x][1]:dp[x][0])+1));//注意如果y是最长链末端的儿子,那么距离需要用次长链 
    }
}
int main()
{
    scanf("%d",&n);
    for (int i=2;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        G[i].push_back(x);
        G[x].push_back(i);
    }
    dfs1(1);
    dfs2(1,0);
    for (int i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}

相关推荐

  1. P1807 题解

    2024-01-01 23:54:01       45 阅读
  2. DAG问题详解

    2024-01-01 23:54:01       29 阅读
  3. 系统设计题-由表匹配

    2024-01-01 23:54:01       25 阅读
  4. 100268. 公共后缀查询(字典查询)

    2024-01-01 23:54:01       39 阅读
  5. 图论复习(小生成

    2024-01-01 23:54:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-01 23:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-01 23:54:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-01 23:54:01       82 阅读
  4. Python语言-面向对象

    2024-01-01 23:54:01       91 阅读

热门阅读

  1. Vue3的proxy

    2024-01-01 23:54:01       64 阅读
  2. python+pytest接口自动化测试之参数关联

    2024-01-01 23:54:01       64 阅读
  3. Keras加载预训练模型

    2024-01-01 23:54:01       62 阅读
  4. R_handbook_基本函数

    2024-01-01 23:54:01       64 阅读
  5. 【记录】开始学习网络安全

    2024-01-01 23:54:01       62 阅读
  6. MySQL唯一索引失效的注意点

    2024-01-01 23:54:01       52 阅读
  7. MFC连接mqtt服务器订阅和发送数据-自设计函数库

    2024-01-01 23:54:01       44 阅读