关于树的直径的一切

这篇具有很好参考价值的文章主要介绍了关于树的直径的一切。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

观前须知

笔者的博客主页

声明

本文使用 CC BY-NC-SA 4.0 许可

本文为笔者在 OI 学习中的复习向学习笔记。
部分内容会比较简略。
如有好的习题会不断补充。

知识简介

以下部分详细证明可见 OI Wiki

定义

树的直径指树上任意两点间距离的最大值。

两次DFS求解

先以任意点为根找到最远点 \(v\)
再以 \(v\) 为根找到最远点 \(u\)
\(u-v\) 即为该树的一条直径。

适用范围:无负权树。

证明:
\(v\) 为直径的一个端点时显然成立。
反证法假设存在更长路径,
分类讨论+画图可得矛盾。

代码:

int dis[AwA], ans;

void Dfs(int u, int fa) {
    if (dis[u] > dis[ans]) ans = u;
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (v == fa) continue;
        dis[v] = dis[u] + e[i].w;
        Dfs(v, u);
    }
}

int GetAns() {
    dis[1] = 0;
    Dfs(1, 0);
    dis[ans] = 0;
    Dfs(ans, 0);
    return dis[ans];
}

树型DP求解

DFS,以当前点为中间点,考虑最长链和次长链,并把最长链继续上传。

代码:

int f[AwA], ans;

void Dfs(int u, int fa) {
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (v == fa) continue;
        Dfs(v, u);
        ans = max(ans, f[u] + f[v] + e[i].w);
        f[u] = max(f[u], f[v] + e[i].w);
    }
}

性质

树的权非负时,树的直径中点重合。
反证法易证。

习题

YbtOj P1577 数字转换

考虑到变为比自己小的因数和是有唯一性的,
那么可建树,以比自己小的因数和为父节点。
因数和比自己大的和 1 无父节点,则设为根。
那么问题变为在森林上求树的直径的最大值。
对每棵树分别求一遍即可。文章来源地址https://www.toymoban.com/news/detail-844406.html

到了这里,关于关于树的直径的一切的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 树的直径问题

    树的直径就树中所有最短路经距离的最大值 求取树的直径可以使用两遍dfs或者树形dp获得 思路: 我们首先任取一点走dfs,然后拿深度最深的点a(必为直径的端点)为root再做一遍dfs,此时获得的最深深度就是树的直径(离直径端点最远的点当然是直径的另一端点) 证明: 如

    2023年04月13日
    浏览(33)
  • 【图论】树的直径

    树的直径即为一棵树中距离最远的两点之间的路径 先以任意一点为起点跑一遍dfs,记录离起点距离最远的点p(这个点一定是直径的一个端点,感性理解一下不证明了),然后再以最远点再跑一遍dfs,记录此时距离最远的点q,那么pq就是该树的直接 树中有负权边时不可以用这

    2024年01月20日
    浏览(37)
  • leetcode543--二叉树的直径

    1. 题意 求二叉树上最远两个节点之间的距离。 2. 题解 2.1 暴力 最长路径的三种情况 通过根节点 在左子树 在右子树 通过根节点的最长路径长度一定是左右子树深度之和。 但是这样求左右子树的深度会不断重复,所以复杂度很高。 2.2 动态规划 我们可以在求深度的时候,更新

    2024年04月26日
    浏览(26)
  • LeetCode: 二叉树的直径(java)

    543题:二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 输入:root = [1,2,3,4,5] 输出:3 解释:3 ,取路径

    2024年02月06日
    浏览(29)
  • LeetCode 热题 100 JavaScript--543. 二叉树的直径

    给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。

    2024年02月14日
    浏览(27)
  • 【图论C++】树的直径(DFS 与 DP动态规划)

    UpData Log👆 2023.9.27 更新进行中 Statement0🥇 一起进步 Statement1💯 有些描述是个人理解,可能不够标准,但能达其意 21-1-1 定义 树上 最远的两个节点之间 的距离被称为 树的直径 ,连接这两个点的路径 被称为 树的最长链 。 21-1-2 性质 1 、这两个最远点一定是叶子节点 1、这 两

    2024年02月07日
    浏览(34)
  • 【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径

    本题所求的实际上是树的直径,即树中的任意两个结点之间的最大距离 采用的方法是dfs 从根节点开始遍历,对于每一个被dfs的结点m,返回此结点m到所有叶子结点的距离最大的那个即d1,同时在dfs过程当中记录结点m到所有叶子结点的距离第二大的那个,即d2 那么最终答案就是

    2024年02月09日
    浏览(25)
  • Web大学生网页作业成品:个人博客主页 (纯HTML+CSS代码)

    🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (

    2024年02月03日
    浏览(39)
  • 关于堆的一切

    首先给出堆的定义: 堆是一颗树,满足堆的性质,即: 对于一个节点,它的权值大于(或小于)它的各个儿子的权值 有这个性质,显然 堆的根节点权值是整个堆中最大或最小的 由此可分为 小根堆 和 大根堆 最常见的堆就是二叉堆 二叉堆是一颗满足 堆的性质 的 完全二叉树

    2024年03月13日
    浏览(25)
  • 关于差分约束的一切

    本文使用 CC BY-NC-SA 4.0 许可 。 本文为笔者在 OI 学习中的复习向学习笔记。 部分内容会比较简略。 如有好的习题会不断补充。 差分约束 解决这样一类问题: 给定一个 n 元一次不等式组,让你求出一组解/判定是否有解/算出某个数的最值/算出和的最值…… 先从最简单的开始

    2024年04月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包