当前位置: 首页 > news >正文

算法提高之树的最长路径

算法提高之树的最长路径

  • 核心思想:树形dp

    • 枚举路径的中间节点
    • 用f1[i] 表示i的子树到i的最长距离,f2[i]表示次长距离
    • 最终答案就是max(f1[i]+f2[i])
    • 在这里插入图片描述
  •   #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e4+10,M = N<<1;int n;int h[N],e[M],ne[M],w[M],idx;int f1[N],f2[N],res;void add(int a,int b,int c){e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;}void dfs(int u,int father){f1[u] = f2[u] = 0;  //当前父节点没有更新过距离for(int i=h[u];~i;i=ne[i]){int j = e[i];if(j == father) continue;  //加边的时候双向边 不能往回走dfs(j,u);  //递归//新的值比最长还大 更新次长为原最长 最长为新最长if(f1[j] + w[i] >= f1[u]) f2[u] = f1[u] , f1[u] = f1[j] + w[i];//先判断上面 再判断下面 只比次长距离长 更新次长else if(f1[j] + w[i] > f2[u]) f2[u] = f1[j]+w[i];}res = max(res,f1[u]+f2[u]);}int main(){memset(h, -1, sizeof h);cin>>n;for(int i=0;i<n-1;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}dfs(1,-1);  //随便一个点作根节点cout<<res<<endl;}
    
http://www.lryc.cn/news/342824.html

相关文章:

  • git/gerrit使用遇到的问题
  • 机器学习第二天(监督学习,无监督学习,强化学习,混合学习)
  • Rust 解决循环引用
  • ICC2:如何解决pin density过高引起的绕线问题
  • Buuctf-Misc题目练习
  • 费马小定理详解
  • PXE批量安装
  • stm32f103c8t6最小系统板
  • QCefView 在 Linux 下的编译(更新)
  • 无卤素产品是什么?有什么作用?
  • esp32-cam 1. 出厂固件编译与测试
  • 题目:线性代数
  • docker学习笔记3:VmWare CentOS7安装与静态ip配置
  • leetcode 547.省份数量
  • Qt5 框架学习及应用 — 对象树
  • Ansible自动化运维工具---Playbook
  • 什么是接口和类?Java中的集合框架有哪些主要接口和类?
  • 算法学习笔记(最短路——Bellman-Ford)
  • try-catch-finally的省略与springboot
  • 容器Docker:轻量级虚拟化技术解析
  • windows 系统中cuda 12.1 环境安装
  • 字节和旷视提出HiDiffusion,无需训练,只需要一行代码就可以提高 SD 生成图像的清晰度和生成速度。代码已开源。
  • linux下dd制作启动U盘
  • springboot整合mybatis配置多数据源(mysql/oracle)
  • 练习项目后端代码解析切面篇(Aspect)
  • TypeScript常见面试题第六节
  • LeetCode 面试经典150题 228.汇总区间
  • 大数据分析入门10分钟快速了解SQL
  • 设置多用户远程登录windows server服务器
  • 一文了解栈