洛谷 P3884 [JLOI2009]二叉树问题

洛谷传送门

JDOJ 2024: [JLOI2009]二叉树问题

JDOJ传送门

Description

如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:

深度:4 宽度:4(同一层最多结点个数)

结点间距离: ⑧→⑥为8  (3×2+2=8)

​ ⑥→⑦为3  (1×2+1=3)

注:结点间距离的定义:由结点向根方向(上行方向)时的边数×2,

与由根向叶结点方向(下行方向)时的边数之和。

Input

输入文件第一行为一个整数n(1≤n≤100),表示二叉树结点个数。接下来的n-1行,表示从结点x到结点y(约定根结点为1),最后一行两个整数u、v,表示求从结点u到结点v的距离。

Output

三个数,每个数占一行,依次表示给定二叉树的深度、宽度及结点u到结点v间距离。

Sample Input

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

Sample Output

4 4 8

一道LCA的好题。

介绍一下大体思路和自己出的bug。

首先存边,存边的时候要存单向边,要不然深搜的时候会卡死在里面。

然后是深搜,深搜主要是预处理的过程,预处理deep数组和fa数组分别记录每个点的深度和父亲节点。具体实现见代码。

然后我们开始枚举最大深度和最大宽度,详见代码,截至此时就出了前两个答案。

最后就是LCA的过程。

可以写倍增LCA,但是倍增LCA其实就是普通朴素LCA的优化,所以我写了朴素LCA(就会这个)(俗名爬一爬)。

这里的LCA函数不是记录公共祖先,而是记录这两个点各向上爬了多少的深度,这里要注意!!因为你会有swap操作,所以你swap之后你的depth1和depth2记录的点向上爬的距离要反着取(以前是1记录x,2记录y,现在要反过来)

然后就可以AC了。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans1,ans2,depth1,depth2;
int tot,to[202],nxt[202],head[101];
int fa[101],deep[101],width[101];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int pre,int step)
{
fa[x]=pre;
deep[x]=step;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
dfs(y,x,step+1);
}
}
void lca(int x,int y)
{
if(deep[x]<deep[y])
{
swap(x,y);
while(deep[x]>deep[y])
x=fa[x],depth2++;
while(x!=y)
{
x=fa[x],y=fa[y];
depth2++;
depth1++;
}
}
else
{
while(deep[x]>deep[y])
x=fa[x],depth1++;
while(x!=y)
{
x=fa[x],y=fa[y];
depth1++;
depth2++;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
dfs(1,0,1);
for(int i=1;i<=n;i++)
width[deep[i]]++;
for(int i=1;i<=n;i++)
ans1=max(ans1,deep[i]);
for(int i=1;i<=n;i++)
ans2=max(ans2,width[i]);
int u,v;
scanf("%d%d",&u,&v);
lca(u,v);
printf("%d\n%d\n%d",ans1,ans2,depth1*2+depth2);
return 0;
}

JLOI 2009 二叉树问题的更多相关文章

  1. 面试大总结之二:Java搞定面试中的二叉树题目

    package BinaryTreeSummary; import java.util.ArrayList; import java.util.Iterator; import java.util.L ...

  2. 九度OJ 1035:找出直系亲属(二叉树)

    题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...

  3. JS - 二叉树算法实现与遍历 (更新中...)

    一.关于二叉树: 截图来自:https://segmentfault.com/a/1190000000740261 温馨提示:学习以及使用二叉树概念,心中永远有这么一个图,对于理解和接受二叉树有很大的 ...

  4. java——二叉树面试题

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...

  5. 九度OJ 1035:找出直系亲属 (二叉树、递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...

  6. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  7. 二叉树的递归实现(java)

    这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...

  8. c 二叉树的使用

    简单的通过一个寻找嫌疑人的小程序 来演示二叉树的使用 #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  9. Java 二叉树遍历右视图-LeetCode199

    题目如下: 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样. 换成通俗的意思:按层遍历二叉树,输出每层的最右端结点. 这就明白时一道二叉树层序遍历的问题,用一个队 ...

随机推荐

  1. HDU 3686 Traffic Real Time Query System(点双连通)

    题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向图,\(q\) 次询问,每次询问两边之间的必经之点个数. 思路 ​ 求两点之间必经之边的个数用的是边双缩点,再求树上距离.而对比边双和点双之 ...

  2. linux vsftp查看ftp账号信息的方法

    linux vsftp查看ftp账号信息的方法 查看注册的FTP账号 在/etc/vsftpd/chroot_list 密码看不到 只能重置密码 passwd username

  3. nohup 启动后台应用

    nohup java -Xmx1024M -Xms1024M -jar app.jar --logging.level=warn --logging.path=/var/log/app--server ...

  4. tomcat 下 base64图片上传超过2m的解决方案

    方案一: tomcat部署下默认post请求提交参数大小为2M左右,超过这个大小,就会传值不成功 要使post请求参数无大小限制,需要在server.xml上修改,如下: <Connector ...

  5. springboot+RabbitMQ 问题 RabbitListener 动态队列名称:Attribute value must be constant

    因为多机环境fanout广播模式,每台机器需要使用自己的队列接受消息 所以尝试使用以下的方案 private static final String QUEUE_NAME="foo.&quo ...

  6. axios解决跨域问题

    最近把我自己的网站升级生成前后端分离的项目(vue+springBoot),不可避免的就遇到了跨域问题.从中学到了许多知识,随便分享出来,也巩固下所学. 谈到跨域,首先得了解CORS(Cross or ...

  7. Kafka学习笔记之Kafka背景及架构介绍

    0x00 概述 本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Producer消息路由,Consumer Group以及由其实现的不 ...

  8. 一般处理程序Session

    1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionState ...

  9. 在<a></a>标签中如何调用javaScript脚本

    在日常工作总会遇到在<a>标签中执行js代码的情况 现在做一个总结,希望对大家有一个帮助. 1.a href="javascript:js_method();" 这是我 ...

  10. PIE SDK剔除栅格块算法

    1.算法功能简介 剔除栅格块即剔除栅格小斑块功能.一幅影像图层某一区域存在碎小斑块,需要对其按照一定的条件进行剔除. PIE支持剔除栅格快算法功能的执行,下面对该算法功能进行介绍. 2.算法功能实现说 ...