树的直径 ← 树形 DP 法(有负权边)

news/2024/7/18 6:03:26 标签: 树的直径, 树形DP, 有负权边

【算法分析】
● 什么是
树的直径?树上任意两结点之间最长的简单路径即为树的直径
无负权边,可以采用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径;若有负权边,则只能采用树形 DP 求解树的直径。显然,一棵树可以有多条直径,因为树中可能存在最长长度相等的多条简单路径。
● 树形 DP 法原理
以某结点为根的子树所能延伸的
最长路径长度 d1次长路径长度 d2 的和 d1+d2 的最大值。特别注意,次长路径与最长路径无公共边

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+5;
vector<int> e[N];
int dis[N][2]; //dis[.][0]:最长, dis[.][1]:次最长
int ans;
int n;

void dfs(int u,int fa) {
    dis[u][0]=dis[u][1]=0;
    for(int x:e[u]) {
        if(x==fa) continue;
        dfs(x,u);
        int t=dis[x][0]+1;
        if(t>dis[u][0]) {
            dis[u][1]=dis[u][0]; //原来最长变为次最长
            dis[u][0]=t; //更新最长
        } else if(t>dis[u][1]) {
            dis[u][1]=t; //更新次长
        }
    }
    ans=max(ans,dis[u][0]+dis[u][1]);
}

int main() {
    cin>>n;
    for(int i=1; i<n; i++) {
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }

    dfs(1,0);

    cout<<ans<<endl;

    return 0;
}


/*
in:
5
1 2
1 3
1 4
4 5

out:
3
*/



【参考文献】
https://blog.csdn.net/y6123236/article/details/135112414
https://www.acwing.com/problem/content/description/4151/
https://blog.csdn.net/triangle_617/article/details/136081972
https://www.luogu.com.cn/problem/P3304
https://blog.csdn.net/hnjzsyjyj/article/details/140253125


http://www.niftyadmin.cn/n/5544038.html

相关文章

anaconda新建虚拟环境并同步至jupyter

很多技能只有常常使用形成习惯后才能成为自己的能力。本篇内容介绍anaconda新建虚拟环境并同步至 jupyter的步骤&#xff0c;亲测有效。 1、打开anaconda prompt。 2、使用如下命令创建一个新的虚拟环境。&#xff08;假设我们要创建一个名为newenv的环境&#xff0c;并且安装…

9.计算机视觉—目标检测

目录 1.物体检测边缘框目标检测数据集总结边缘框代码实现2.锚框:目标检测的一种方法IoU—交并比赋予锚框标号使用非极大值抑制(NMS)输出总结代码实现1.物体检测 边缘框 一个边缘框可以通过四个数字定义 (左上x,左上y),(右下x,右下y)(左上x,左上y,宽,高)(中间x,中间y…

在线简历制作工具

一、简介 1、一款开源且免费的在线简历制作工具,提供了设计精美的高质量模板。用户可以灵活调整整个简历模板及其各个内容模块的主题和样式。制作完成的简历可以保存并导出为 PDF 格式,方便使用。 二、下载 1、文末有下载链接,不明白可以私聊我哈(麻烦咚咚咚,动动小手给个关…

Leetcode 3209. Number of Subarrays With AND Value of K

Leetcode 3209. Number of Subarrays With AND Value of K 1. 解题思路2. 代码实现 题目链接&#xff1a;3209. Number of Subarrays With AND Value of K 1. 解题思路 这一题的话整体上是一个滑动窗口的思路&#xff0c;我们维护一个滑动窗口&#xff0c;确保其每一个窗口都…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西&#xff0c;截取字符串&#xff0c;参数化文件统一用csv&#xff0c;然后还要用excel打开&#xff0c;如果是数字很容易格式就乱了。有同事是用双引号把数字引起来&#xff0c;报文里就不用加引号了&#xff0c;但是这样beanshell处理起来&#xff0c;好像容…

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型&#xff0c;只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导&#xff0c;使用auto声明的变量必须进行初始化&#xff0c;以让编译器推导出它的实际类型&#xff0c;…

Kafka抛弃Zookeeper后如何启动?

Kafaka如何下载 官网地址 目前Kafka最新的版本就是3.7.1 我们可以看到下面这两个版本信息&#xff1f;什么意思呢&#xff1f; Scala 2.12 - kafka_2.12-3.7.1.tgz (asc, sha512)Scala 2.13 - kafka_2.13-3.7.1.tgz (asc, sha512) 我们应该知道&#xff0c;一个完整的Kafka实…