树上的最远距离

题目

题目描述

给定一棵树,对于每一个点,输出离它最远的点到它的距离。

输入格式

第一行包含整数 \(n\)

接下来 \(n-1\) 行,每行包含两个整数 \(a_i,b_i\),表示点 \(a_i\)\(b_i\) 之间存在一条边。

输出格式

输出一行 \(n\) 个整数,第 \(i\) 个数表示离节点 \(i\) 最远的点到它的距离。

样例

输入数据#1

8
1 5
1 4
6 3
2 6
6 1
3 7
4 8

输出数据#2

3 4 4 4 4 3 5 5

数据范围

  • 对于 \(20\%\) 的数据:\(1≤n≤10\)
  • 对于 \(60\%\) 的数据:\(1≤n≤10^3\)
  • 对于 \(100\%\) 的数据:\(1≤n≤10^5\)\(1≤a_i,b_i≤n\)

思路分析

树的直径好题。

我们如果对每个点都跑一遍树的直径 dfs,时间复杂度 \(O(n^2)\),超时。数据范围 \(n\leq10^5\) 显然只允许我们跑一遍树的直径 dfs。

其实,我们只需先找到一条直径,然后对于每个点,比较两个端点哪个距离该点较远即可。

现在求点 \(u\) 最远的点到它的距离,记为 \(ans\),跑树的直径 dfs 后得到直径 \(a\to b\),分类讨论:

若点 \(u\) 不在直径 \(a\to b\) 的路径上,如下图:

反证法:

假设有点 \(v\) 是点 \(u\) 最远的点,距离为 \(s_2+s_4\),直径的端点 \(a\) 到点 \(u\) 的距离为 \(s_2+s_3\),则:

\[s_2+s_4>s_2+s_3 \]

解得 \(s_4>s_3\)

所以 \(x\to v\) 的路径比 \(x\to a\) 的路径更长,直径则应为 \(s_1+s_4\),与树的直径是 \(a\to b\) 矛盾,显然不存在。

若点 \(u\) 在直径 \(a\to b\) 的路径上:

证明如上,其中 \(s_2=0\),显然也不存在。

证毕。

\(\texttt{code}\)

/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define QAQ cout<<"QAQ\n";
const int MAXN=1e5+5,inf=1e18,mod=1e9+7;
int n;
vector<int> g[MAXN];
int dist[MAXN],d[MAXN];
int dfs(int now,int fa){int ans=now;for(auto x:g[now]){if(x==fa){continue;}dist[x]=dist[now]+1;int d=dfs(x,now);if(dist[d]>dist[ans]){ans=d;}}return ans;
}
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<n;i++){int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);}int u,v;u=dfs(1,0);dist[u]=0;v=dfs(u,0);for(int i=1;i<=n;i++){d[i]=dist[i];}dist[v]=0;dfs(v,0);for(int i=1;i<=n;i++){cout<<max(d[i],dist[i])<<" ";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846379.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go 多线程

goroutine以及gmp原理go 多线程 进程、线程、和协程进程分配系统资源(CPU 时间、内存等)基本单位 有独立的内存空间,切换开销大线程:进程的一个执行流,是 CPU 调度并能独立运行的的基本单位同一进程中的多线程共享内存空间,线程切换代价小 多线程通信方便 从内核层面来看…

第57篇 docker的常用命令

1 镜像管理2 容器管理3 容器运行4 网络管理5 插件管理6 数据卷管理7 日常操作8 常用dockerfile指令

技术美术学习路线

技术美术学习路线 理想路线 第一个阶段熟练一门编程语言(课设写个例如医院管理系统,图书管理系统之类的):C/python/C++/C#,并尝试用它写一个飞机大战小游戏养成良好的审美,每日收集图片,鉴赏各种美术风格从Unity客户端开始学习,之后逐步学习技术美术:如何不写代码却能…

Pwn-栈溢出

原理 基本的栈帧结构(以 x64 的栈为例)(图片摘自Hello-CTF) RBP 为栈底寄存器,RSP 为栈顶寄存器,分别记录了栈帧中记录数据部分的起始和终止地址。函数的临时变量的在内存中的位置都是通过这两个寄存器加减偏移确定的。 栈底分别还记录了上一个栈帧的 RBP 的值,以及函数的…

DSB的数字正交解调

1.DSB调制过程 ​ DSB信号是一种双边带调幅调制信号,又叫双边带调幅,通过改变载波的振幅来实现基带数据的传输。 其函数表达式如下: \[s(t) = m(t)*cos(2\pi ft + \varphi) \]其中:m(t):表示基带信号。 \(cos(2\pi ft + \varphi )\):表示载波信号。2.DSB的数字正交解调 ​ …

JDY-68A模块语音播报

该模块引脚如下图所示:连接其中的VCC与GND即可让蓝牙模块运行起来 如果要实现播放手机中的声音,需要参考下面图中第10个引脚其中Audio是声音输出,连接功放模块的输入+,而功放模块中的输入-直接接地线即可。 该模块有个问题就是其为贴片设计,需要自行设计底板,但是如果只是要测试…

《代数学基础Ⅰ》期中考试分析

总体分析:本次考试得分85(17%),尚可,但未达到自己的预期(90+)。 错题分析:目前未下发答题纸,我觉得主要有两方面问题。 1. 分类讨论不全,特别关注分式的分母能否取零导致的分类 2. 当且仅当的证明,这是一个充要条件,充分性多数情况下比较难证,要多加练习。(坏了,…

第56篇 docker简单介绍

1.docker介绍 Docker是一个用于构建,运行,传送 应用程序的平台。以下所有环境打包成一个集装环境1.1 为什么要用docker? 第一点:安装依赖过多 如果不用docker,需要部署一个带有数据库的,前后端服务的应用时,就要执行step的步骤安装环境,网站才能运行该应用第二点:不同…

设计位置编码

Gall 定律 一个有效的复杂系统通常是从一个有效的简单系统演化而来的 —— John Gall本文将带你一步步探究 Transformer 模型中先进的位置编码技术。我们将通过迭代改进编码位置的方法,最终得出 旋转位置编码 (Rotary Postional Encoding, RoPE),这也是最新发布的 LLama 3.…

中国AI大模型市场:创业公司在巨头竞争中的生存之道|报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p=38460 在2023年10月上旬的一次聚会中,众多投资了AI大模型的投资者在轻松的氛围中探讨了当前市场的严峻挑战。市场数据显示,仅仅半年前,投资者们还在为争夺投资份额而焦虑。然而,当前市场情绪已经发生了转变,投资者普遍认为,大模型领域的…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|附数据代码

全文链接:https://tecdat.cn/?p=38442 原文出处:拓端数据部落公众号 分析师:Yufei Guo 在现代土木结构工程领域,结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法,如目视检查以及借助专业设备进行检测,在很长一段时间内…

【专题】日本车企利润骤降94%,裁员9000人,中国新能源汽车行业迎头赶上|报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p=38407 在全球化的汽车产业竞争中,中国新能源汽车的迅猛发展正重塑市场格局。近期,日本车企遭遇前所未有的挑战,利润大幅下滑,日产净利润暴跌94%,全球裁员9000人,而丰田等巨头也感受到了市场的压力。与此同时,中国品牌如比亚迪以破纪录的…