树的直径

树的直径是指树上最长的路径。该路径的性质包括:与树中任意一点距离最远的点是直径的端点;找到使其他点到它的最大距离最小的点,其最大值等于直径的一半加奇偶修正;通过两次深度优先搜索可以找到直径的两端;最短欧拉路径等于树所有边长之和减去直径。解析提供了两种方法:直接求直径两端并遍历,或求反向最大距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的直径是树形结构上距离最长的路径

树的直径一些性质:

1.与树上任意一点x最远的点一定是直径的两端

2.在树上找到一点,其他点到这个点的距离最大值最小,最大值=直径/2+直径%2

3.任选一点,找到最远的点,该点必是直径一端,从该点找最远的另一点,另一点必是直径的另一端

4.树上:最短欧拉路=2*树的所有边长和-树的直径

由1->3

解析:

方法1:

直接求出直径的两端,从两端遍历出结果取最大值

二次搜索出结果

ac:

#include<bits/stdc++.h>
#define MAXN 200005
#define ll long long
using namespace std;
int to[MAXN<<1],head[MAXN<<1],nxt[MAXN<<1],val[MAXN<<1];
int tot=0;
int v1;
ll mins;

void init()
{
    mins=0;
    memset(head,0,sizeof(head));
    tot=0;
}

void add(int u,int v,int w)
{
    to[++tot]=v;
    val[tot]=w;
    nxt[tot]=head[u];
    head[u]=tot;
}

void dfs(int x,int fa,ll dis)
{
    if(dis>mins)
        mins=dis,v1=x;
    for(int i=head[x];i;i=nxt[i])
    {
        int v=to[i];
        if(v==fa)
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值