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

算法提高之树的中心

算法提高之树的中心

  • 核心思想:树形dp + 换根dp

    • 每个点作为根节点 找其子树的最大距离和父节点的最大距离

    • dfs1:求子树对于当前根节点的最大距离和次大距离

      • 求次大距离原因:如果当前节点是其父节点子树的最大路径上的点,最大距离不能用
      • 在这里插入图片描述
    • dfs2:找父节点以上的最长距离

  •   #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 10010,M=N<<1,INF=0x3f3f3f3f;int n;int h[N],e[M],ne[M],w[M],idx;int d1[N],d2[N],up[N];int s1[N],s2[N];  //s1存该点最大距离从哪个点过来 s2存次大距离...void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;}void dfs1(int u,int father){for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j == father) continue;dfs1(j,u);if(d1[j] + w[i] >= d1[u]){d2[u] = d1[u],d1[u] = d1[j]+w[i];s2[u] = s1[u],s1[u] = j;}else if(d1[j] + w[i]> d2[u]){d2[u] = d1[j]+w[i] , s2[u] = j;}}}void dfs2(int u,int father){for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j==father) continue;//如果j为求最大距离时用的点 d1[u]不能用if(s1[u] == j) up[j] = w[i] + max(up[u],d2[u]);  else up[j] = w[i] + max(up[u],d1[u]);dfs2(j,u);}}int main(){memset(h,-1,sizeof h);cin>>n;for(int i=1;i<n;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c) , add(b,a,c);}dfs1(1,-1);dfs2(1,-1);int res=INF;for(int i=1;i<=n;i++) res = min(res,max(d1[i],up[i]));cout<<res<<endl;}
    
http://www.lryc.cn/news/343485.html

相关文章:

  • 【Java基础】面向对象是什么
  • 家用洗地机应该怎么选?哪个牌子好?市场上主流洗地机品牌推荐
  • python Django REST framework允许你根据API的版本提供不同的行为或数据
  • unity给物体添加可以包裹所有子物体的BoxCollider
  • 2024五一数学建模A题思路代码与论文分析
  • ICode国际青少年编程竞赛- Python-1级训练场-基础训练2
  • 科技控必看!让你轻松成为机器人领域达人
  • Linux进程——Linux下常见的进程状态
  • TCP长连接短链接
  • 代码随想录35期Day33-Java
  • PMP考试没过怎么办?如何补考?(附复核流程)
  • 自主实现Telnet流量抓取
  • 以瓦片地图为底图添加图表,保留拖拽功能
  • Windows cmd bat之特殊符号及变量
  • 用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)
  • axios 取消token 模糊搜索
  • 【OTS4WORD】“精简并行过程”——容易剪裁的“软件过程改进方法和规范”模板
  • 22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
  • 【AIGC调研系列】VILA-1.5版本的视频理解功能如何
  • 如何解决WordPress邮件发送和接收问题
  • MySQL学习笔记10——日志
  • OpenSPG docker 安装教程
  • TypeScript学习日志-第十六天(泛型)
  • Flutter路由跳转的两种方式
  • Hydroxyethyl-PEG-Hydroxyethyl,Hy-PEG-Hy是一种由聚乙二醇(PEG)和二酰肼单元构成的嵌段共聚物
  • 链表面试题目:反转一个单链表的两种方法(解析+代码)
  • [C++][数据结构]AVL树插入的模拟实现
  • 力扣每日一题108:将有序数组转换为二叉搜索树
  • 保护公司机密:避免员工带着数据说拜拜
  • kali apt update报错