桃花
题解

讨论

查看他人的提交

我的提交

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
桃花一簇开无主,可爱深红映浅红。

                                    ——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。

输入描述:
第一行有一个正整数n,表示桃树的节点个数。
接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
示例1
输入
复制
3
1 2
2 3
输出
复制
3
示例2
输入
复制
3
1 2
1 3
输出
复制
3
示例3
输入
复制
4
1 2
2 3
3 4
输出
复制
4
备注:
对于100%的测试数据:
1 ≤ n ≤ 1000000
数据量较大,注意使用更快的输入输出方式。

两次遍历是指从任意一点出发到最远的一个点,在从这一个点出发,遍历到的最远的路径即是答案。

一次遍历是指我们需要的即是一棵树的最长和第二长的子树之和,我们每一次维护两个值即可,然后边遍历,边返回值。

两次遍历法:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8;vector<int>mp[maxn];//邻接表存图int n;
int ans=0;
int now=1;
int vis[maxn];
void dfs(int u,int dist)
{if(ans<dist)//只要比ans大就更新{ans=dist;now=u;//记录第一次能跑的最远的点}vis[u]=1;for(int i=0;i<mp[u].size();i++){int j=mp[u][i];if(!vis[j])dfs(j,dist+1);}
}int main()
{cin>>n;for(int i=1;i<=n-1;i++){int u,v;cin>>u>>v;mp[u].push_back(v);mp[v].push_back(u);}dfs(1,0);//第一次遍历memset(vis,0,sizeof vis);dfs(now,0);//第二次遍历cout<<ans+1<<endl;return 0;
}

一次遍历法

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 20010, M = 20010;int n, m;
int h[N], e[M], ne[M], idx;
int ans;
//链式前向星存图,但是内存超限过不了
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}int dfs(int u)
{int d1 = 0, d2 = 0;//一个最大值,一个次大值for (int i = h[u]; ~i; i = ne[i]){int j = e[i];int d = dfs(j);if (d >= d1) d2 = d1, d1 = d;else if (d > d2) d2 = d;}ans = max(ans, d1 + d2);//实时更新答案return d1 + 1;//+1是指当前点到上一个点的边
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);for (int i = 2; i <= n; i ++ ){int p;cin >> p;add(p, i);}for (int i = 1; i <= m; i ++ ){int p;cin >> p;add(p, n + i);}dfs(1);cout << ans+1<< endl;return 0;
}

树的最长直径一次遍历和两次遍历法相关推荐

  1. 树的最长直径(邻接表)

    可以证明从树的任意一点出发,所能到达的最远距离一定是树的最大直径的端点.所以两次bfs(),一次任意一点出发,一次端点出发,便能找到最大直径. 程序代码如下:(求树上两端点的最远距离) #includ ...

  2. 算法提高课-动态规划-树形DP-AcWing 1072. 树的最长路径:dfs写法

    题目分析 来源:acwing 分析: 树的最长直径:距离最远的两个点之间的距离,这里是带边权的情况. 在没有边权(或者边权都是1)的时候,树的直径也是最远两个点的距离. 样例对应的树如下,树的直径= ...

  3. 树的直径,树的最长路dp思想

    dp一直弱死了,树型dp很多基本的题都不会,最近在刷树型dp的题,把关于树的最长路的思想总结一下: 树的直径:树中距离最远的两点间的距离. 下面说几道题: hdu 2196:对于树上(双向边)的每一个 ...

  4. Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索

    题目描述 原题链接: https://www.acwing.com/problem/content/1074/ 思路 以下针对树的边权都一样的情况. 推荐使用BFS, 比赛的时候栈空间只有1MB,DF ...

  5. Acwing 1072. 树的最长路径

    Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子, ...

  6. 森林资源调查 |基于无人机平台应用激光雷达技术获取树木信息 (包含位置、树高、树冠直径、树冠面积和树冠体积等)

    一.场景概述 森林资源调查的重要内容之一是测量样方内单木的树种.树高.胸径及所在位置等.激光雷达技术能够同时获取森林冠层表面的水平和垂直结构信息,基于高密度的激光雷达点云不仅能够获取林分尺度森林参数, ...

  7. 201503-4 网络延时 (本质是求树的最长路径)

    树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...

  8. poj 3310(并查集判环,图的连通性,树上最长直径路径标记)

    题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...

  9. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法

    问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...

最新文章

  1. 修改Ubuntu的aptget源为阿里源的方法
  2. ASP.NET 4学习笔记(1) SQL注入攻击及解决方案.
  3. log4j监控mybatis的普通配置
  4. TCP长连接与短连接的区别(转)
  5. Spring框架之Filter应用
  6. vim打造成C++的IDE
  7. 凉山州计算机等级考试时间,2020年四川凉山中考考试时间及科目安排(已公布)...
  8. Android Studio查看MD5与SHA1
  9. 新手学习selenium路线图(老司机亲手绘制)-学前篇(转上海悠悠)
  10. SpringBoot整合J2Cache
  11. kdj买卖指标公式源码_KDJ买卖副图指标 源码 通达信 贴图
  12. Java 上机----实训操作6---汽车类
  13. 机器学习与算法(8)--局部加权学习算法(LWR)
  14. 根据日期计算当月有多少天
  15. 纯css制作“破镜重圆”效果
  16. Hebutgo 7.21 git使用(alicode)
  17. 常见乱码问题分析和总结
  18. 磨金石教育手机摄影技巧||处理好照片的主次,出片率提高10倍!
  19. java基本语法实验体会_Java基本语法实验报告
  20. 马斯洛需求:互联网产品设计的理论支点

热门文章

  1. 看一眼凌晨4点的哈佛,你就知道牛逼都来自苦逼!
  2. JS学习-创建对象练习
  3. 水电站项目远程监管系统
  4. hdu 3008 Warcraft
  5. 记一次 群晖利用calibre-web 实现 电子书管理 之 technosoft2000/calibre-web
  6. 海最深多少米|海最深是什么地方
  7. Windows 10开发教程_编程入门自学教程_菜鸟教程-免费教程分享
  8. oracle删除过期数据语句
  9. 解读Android官方MVP项目单元测试
  10. UE4卧倒趴着实现思路