两种树的直径求法

两遍DFS

优点:方便记录直径的两端点。

缺点:无法除理带负权的树。

树形DP

优点:短,可以处理有负权的树。

缺点:不好记录端点,容易打错。

最初每条路要走两遍,修一条路就可使与它形成环的路少走一遍,先找到直径,然后把与直径形成环的点边的边权改为-1(因为每条路至少走一遍,第一次少走1,第二次就不能少走了),然后再找一次直径。

#include
using namespace std;
const int MM=1000006,inf=0x3f3f3f3f;
int dis[MM],nxt[MM*2],to[MM*2],head[MM],q[MM*2],dep[MM],f[MM],tot,maxl,s,t,n,k,u,v,zj[MM],lzj1,lzj2;
void add(int u,int v)
{
    nxt[++tot]=head[u];
    head[u]=tot;
    to[tot]=v;
    q[tot]=1;
}
void dfs(int now,int deep,int fa)
{
    dep[now]=deep;
    f[now]=fa;
    for(int i=head[now];i;i=nxt[i])
        if(to[i]!=f[now])dfs(to[i],deep+1,now);
}
void dfs1(int now,int len)
{
    if(len>maxl)
    {
        maxl=len;
        s=now;
    }
    for(int i=head[now];i;i=nxt[i])
        if(to[i]!=f[now])dfs1(to[i],len+1);
}
void dfs2(int now,int len,int fa)
{
    if(len>maxl)
    {
        maxl=len;
        t=now;
    }
    for(int i=head[now];i;i=nxt[i])
        if(to[i]!=fa)dfs2(to[i],len+1,now);
}
void dfs3(int now)
{
    for(int i=head[now];i;i=nxt[i])
    {
        if(to[i]!=f[now])
        {
            dfs3(to[i]);
            lzj2=max(lzj2,dis[now]+dis[to[i]]+q[i]);
            dis[now]=max(dis[now],dis[to[i]]+q[i]);
        }
    }
}
int main()
{
    cin>>n>>k;
    for(int i=1;i1;i++)
    {
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(1,1,0);
    dfs1(1,0);
    dfs2(s,0,0);
    if(dep[s]<dep[t])
        swap(s,t);
    while(dep[s]>dep[t])
        zj[s]=1,s=f[s];
    lzj1=maxl;
    if(k==1)
    {
        cout<1)*2-lzj1+1;
        return 0;
    }
    while(s!=t)
    {
        zj[s]=1,zj[t]=1;
        s=f[s],t=f[t];
    }
    zj[s]=1;
    for(int i=1;i)
    {
        if(zj[i])
        {
            for(int j=head[i];j;j=nxt[j])
            {
                if(zj[to[j]])
                    q[j]=-1;
            }
        }
    }
    dfs3(1);
    //cout<
    cout<1)*2-(lzj1+lzj2)+2;
    return 0;
} 

Original: https://www.cnblogs.com/29taorz/p/15342614.html
Author: T_X蒻
Title: 两种树的直径求法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644239/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • html大文件传输解决方案

    1、介绍enctype enctype 属性规定发送到服务器之前应该如何对表单数据进行编码。 enctype作用是告知服务器请求正文的MIME类型(请求消息头content-typ…

    技术杂谈 2023年5月30日
    081
  • os里边的函数用法(持续更新)

    os.environ 对于官方的解释,environ是一个字符串所对应环境的映像对象我们想要用python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面…

    技术杂谈 2023年7月11日
    077
  • python-数据描述与分析(1)

    数据描述与分析 在进行数据分析之前,我们需要做的事情是对数据有初步的了解,这个了解就涉及对行业的了解和对数据本身的敏感程度,通俗来说就是对数据的分布有大概的理解,此时我们需要工具进…

    技术杂谈 2023年7月25日
    0104
  • 深入浅出依赖注入及其在抖音直播中的应用

    深入浅出依赖注入及其在抖音直播中的应用 https://mp.weixin.qq.com/s/Zp-OqCVVr9CbDv1Y1zWN-w Original: https://ww…

    技术杂谈 2023年5月31日
    098
  • Python导入cx_Oracle报错

    系统环境:RHEL5.4 python2.5(手动编译安装,系统带有2.4版本) 在使用python脚本访问数据库时,需要导入cx_Oracle模块 $>>>im…

    技术杂谈 2023年7月11日
    060
  • synchronized原理剖析

    synchronized原理剖析 并发编程存在什么问题? 1️⃣ 可见性 可见性:是指当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值。 案例演示:一个线程…

    技术杂谈 2023年6月21日
    098
  • linuxvscodeextensionC#`GLIBC_2.27’notfound

    settings中omnisharp:useModernNet改为true reboot虚机 posted @2022-05-05 11:15 chester·chen 阅读(84…

    技术杂谈 2023年7月24日
    0104
  • Random在高并发下的缺陷以及JUC对其的优化

    Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了。但并…

    技术杂谈 2023年7月25日
    093
  • redis

    Nosql概述 因为数据的访问量越来越大,单靠关系型数据库已经无法支撑用户需求,所以架构也在用户的需求下一步步进行演进。 1、单机Mysql时代 90年代,一个网站的访问量一般不会…

    技术杂谈 2023年7月11日
    055
  • MySQL — 索引

    索引(Index)是高效获取数据的数据结构,就像书的目录,提高检索数据的效率。 优点:提高数据检索效率,降低数据库的 IO 成本;通过索引列对数据进行排序,降低数据排序的成本,降低…

    技术杂谈 2023年7月11日
    060
  • 附加进程到远程服务器中Docker容器内调试

    很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常。通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程。 VS…

    技术杂谈 2023年7月23日
    091
  • [css] css实现文字竖向排列以及设置间距

    想要实现竖向排列文字,设置间距 只需要下面两个属性 writing-mode: vertical-rl;//从右往左排 vertical-lr是从左往右排 letter-spaci…

    技术杂谈 2023年6月1日
    084
  • [学习笔记]Java接口

    接口是Java中的一种抽象类型,是抽象方法的集合; 接口使用 interface关键字声明; 接口不是类,它们属于不同的概念,类描述对象的属性和方法,接口则包含要实现的方法; 一个…

    技术杂谈 2023年7月24日
    076
  • matplotlib add_subplot用法

    在画面增加好之后,就需要在画面中定义表格,可以通过下面方法增加表格 self.axes = self.fig.add_subplot(211) 上面的意思是增加两行一列一块 Ori…

    技术杂谈 2023年7月11日
    082
  • PYTORCH: 60分钟 | 训练一个分类器

    你已经知道怎样定义神经网络,计算损失和更新网络权重。现在你可能会想, 那么,数据呢? 通常,当你需要解决有关图像、文本或音频数据的问题,你可以使用python标准库加载数据并转换为…

    技术杂谈 2023年7月25日
    083
  • 机器学习(4)特征值的处理之归一化,标准化

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9982882.htmlAuthor…

    技术杂谈 2023年7月23日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球