news 2026/4/17 20:15:49

20250124树的直径总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
20250124树的直径总结

需要说吗?

直径

直径为树上一条边权和最长的简单路径,以下是直径的一些常用性质:

  1. 树的直径不一定唯一
  2. 树的直径的端点一定是度数为1的点
  3. 若直径有数条,那么所有直径交汇于至少一点
  4. 树上任一点距离其最远的点一定是直径的两个端点之一
  5. 在叶子节点处增加或删除一条边,直径至多增减1(边权为负数除外)
  6. 给定2棵树,添加一条边连接两棵树,新的树的直径至少为
    max((d1+1)/2+(d2+1)/2+w,d1,d2)

具体实现方法为两遍DFS或BFS,第一次从任一点出发,找到离该点最远的点x,然后再调一次函数找到离x最远的点y,Sx->y就是直径的长度。

知道了这些相信你一定可以做出模板题了!

B4016 树的直径

模板参考代码注释即可。

#include<bits/stdc++.h>usingnamespacestd;vector<int>E[100005];intans=0,X,Y;voiddfs(intx,intfa,intid,intsum){if(sum>=ans){//如果目前的距离比原来更好就更新//等于为什么要更新呢?这是因为第二次深搜时ans没有清零,或者清零也行//可能第二次深搜答案刚好等于第一次深搜的答案,于是y就没有更新,最好加个等于号ans=sum;if(id==1){//第一次深搜X=x;}else{Y=x;}}for(inti=0;i<E[x].size();i++){intv=E[x][i];if(v==fa)continue;dfs(v,x,id,sum+1);//距离加一}}intmain(){intn;cin>>n;for(inti=1;i<n;i++){intu,v;cin>>u>>v;E[u].push_back(v);E[v].push_back(u);}dfs(1,0,1,0);//第一次从任一点出发dfs(X,0,2,0);//第二次从x点出发cout<<ans;return0;}

CF1404B Tree Tag

看题可得知题意:alice和bob依次在一棵树上轮流移动移动da和db的距离,问alice能否追到bob。

首先初始时如果它们之间的距离比da小,那么alice必胜,因为她先手,距离过小时可以直接抓到。就比如你要抓博尔特,贴脸抓,他还没开始跑你一伸手就抓到他了。

否则接着alice考虑最优策略:跑到直径的中间位置,这样她距离所有点最近,这样如果直径的一半向上取整小于等于da,那么alice必胜,因为这样无论bob跑到哪alice抓一下就抓到了。就比如你要抓博尔特,在厕所里面抓,博尔特无论跑到哪你都一定抓得到。

再否则不行,那么alice考虑最后的最优策略:把bob逼到叶子节点去,假设bob已经到叶子节点了,他还要脱离的话就得一次跳过alice的捕捉范围,也就是说要bob胜必须db>da*2,否则alice胜。就比如你要抓博尔特,在死胡同里抓,博尔特跑到最里面除非从你头上跳过去否则你都一定抓得到。

#include<bits/stdc++.h>usingnamespacestd;vector<int>E[100005];intans=0,X,dis[100005];voiddfs(intx,intfa,intsum){//找直径长度dis[x]=sum;if(sum>=ans){ans=sum;X=x;}for(inti=0;i<E[x].size();i++){intv=E[x][i];if(v==fa)continue;dfs(v,x,sum+1);}}intmain(){intt;cin>>t;while(t--){memset(dis,0,sizeofdis);ans=X=0;intn,a,b,da,db;cin>>n>>a>>b>>da>>db;for(inti=1;i<=n;i++)E[i].clear();for(inti=1;i<n;i++){intu,v;cin>>u>>v;E[u].push_back(v);E[v].push_back(u);}dfs(a,0,0);intggy=dis[b];dfs(X,0,0);if(ggy<=da||db<=da*2||(ans+1)/2<=da){cout<<"Alice"<<endl;}else{cout<<"Bob"<<endl;}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:47:39

聊聊微网动态经济调度中场景生成与削减那些事儿

[1]关键词&#xff1a;场景生成&#xff1b;场景削减&#xff1b;概率分布&#xff1b;随机优化 [2]参考文献&#xff1a;《一种在微网动态经济调度中考虑风电随机性的方法》 [3]主要内容&#xff1a;Matlab 采用正态分布和韦布尔分布描述风电&#xff0c;光伏和负荷概率分布&a…

作者头像 李华
网站建设 2026/4/18 8:10:06

华为OD机考双机位C卷 - 最佳植树距离(Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 - 最佳植树距离 题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在一…

作者头像 李华
网站建设 2026/4/7 12:44:19

华为OD机考双机位C卷 - 荒岛求生 (Java Python JS C/C++ GO )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 - 荒岛求生 题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生…

作者头像 李华
网站建设 2026/4/18 2:14:21

PLC在电网备用电源自动投入中的奇妙应用:双电源切换组态解析

No.495 PLC 在电网备用电源自动投入中应用双电源切换组态有 带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面 在电网系统中&#xff0c;备用电源自动投入装置对于保障供电的连续性和稳定性至关重要。今天咱们就唠唠PLC&#xff08;可编程逻辑控制器&am…

作者头像 李华
网站建设 2026/4/18 8:01:23

自动驾驶规划与控制算法:经验与理论的交融

规划及控制算法理论分析&#xff0c; 涵盖详细的自动驾驶规划及控制模块的算法理论&#xff08;规划大约有18页&#xff0c;控制大约有17页&#xff09;。 其中规划模块主要围绕Apollo6.0实现的EMplanner展开&#xff0c;控制算法详细叙述了常用控制算法包括PID、模糊控制、LQR…

作者头像 李华
网站建设 2026/4/17 11:10:36

基于S7 - 200 PLC和MCGS组态的调试控制系统搭建

No.1161 基于S7-200 PLC和MCGS组态的调试控制系统 带解释的梯形图程序&#xff0c;接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面 在自动化控制领域&#xff0c;S7 - 200 PLC与MCGS组态软件的结合应用十分广泛。今天就来详细聊聊如何基于这两者构建一个调试控制系统…

作者头像 李华