博客
关于我
树的直径
阅读量:216 次
发布时间:2019-03-01

本文共 1492 字,大约阅读时间需要 4 分钟。

树的直径

定义

在树结构中,任意两点间的距离定义为连接这两点的路径边权之和。树中距离最远的两点之间的距离称为树的直径,连接这两点的路径称为最长链或直径。树的直径既可以是一个数值,也可以具体指一条路径。

树的直径性质

  • 直径两端点一定是两个叶子节点

    树的直径的两端点必须是树的叶子节点,因为叶子节点没有子节点,无法通过其他路径连接到其他节点。

  • 距离任意点最远的点一定是直径的一个端点

    基于贪心求直径方法的正确性,可以得出距离任意点最远的点一定是树的直径的一个端点。

  • 两棵树合并后的直径端点一定是原两棵树直径端点的组合

    如果将两棵树通过一条边连接,新树的直径端点一定是原两棵树直径端点的两两组合中的最大值。

  • 多条直径的存在必然会有一个公共交点

    如果树中存在多条直径,那么所有这些直径必然会有一个共同的交点。

  • 树的直径求法

    方法一:树形DP

    树形动态规划是一种求树的直径的高效方法。通过对树进行深度优先遍历,记录每个节点到根节点的最远距离,可以计算出树的直径长度。

    方法二:两次DFS/BFS

  • 第一次遍历

    从任意一个节点出发,对树进行遍历,记录该节点到所有其他节点的最大距离。这个最大距离即为树的直径的一端。

  • 第二次遍历

    从第一次遍历中找到的最远节点出发,再次对树进行遍历。这次找到的最远节点即为树的直径的另一端。

  • 通过上述两次遍历,可以得到树的直径长度以及连接两端点的路径。

    伪代码示例

    #include 
    #include
    #include
    #include
    #include
    using namespace std;#define set0(a) memset(a, 0, sizeof(a))#define set1(a) memset(a, -1, sizeof(a))const int maxm = 1e5 + 5;int head[maxm], to[maxm], nt[maxm], w[maxm];int mark[maxm];int cnt, id;int save_first(int x, int num) { if (num > ans) { ans = num; id = x; }}void dfs(int x, int num) { if (num > ans) { ans = num; id = x; } mark[x] = 1; for (int i = head[x]; i != -1; i = nt[i]) { int v = to[i]; if (!mark[v]) { dfs(v, num + w[i]); } }}int main() { set1(head); int a, b, c; while (scanf("%d %d %d", &a, &b, &c) != EOF) { add(a, b, c); } set0(mark); dfs(1, 0); set0(mark); dfs(id, 0); cout << ans << endl; return 0;}

    关键词优化

    树的直径、树结构、树的最长路径、树的直径求法、树的直径性质

    转载地址:http://uluv.baihongyu.com/

    你可能感兴趣的文章
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>