【备战秋招】每日一题:4月8日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

news2025/1/12 23:29:57

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第二题-必经之路

在线评测链接:P1167

题目内容

塔子哥的班主任最近组织了一次户外拓展活动,让班里的同学们一起去爬山。在路上,塔子哥看到了一棵漂亮的树,他对这棵树产生了浓厚的兴趣,开始观察并记录这棵树的一些特征。

塔子哥发现这棵树有 n 个节点,其中有一条边被特别标记了出来。他开始思考这条特殊的边在树上起到了什么样的作用,于是他想知道,经过这条选定边的所有树上简单路径中,最长的那条路径有多长,以便更好地理解这棵树的结构。

一条简单的路径的长度指这条简单路径上的边的个数。

输入描述

第一行一个整数 n ,表示树的节点个数。

第二行 n-1 个整数,第 i 个数 p_i表示节点 i+1 和p_i之间有一条边相连。

第三行两个整数 x , y ,表示这条选定的边。保证这条边一定是树上的一条边。

对于全部数据, 2 \le n \le 10^51 \le p_i \le n1 \le x,y \le nx \neq y

保证输入数据正确描述一棵树,并且( x, y ) 是树上的条边。

输出描述

输出一行,一个整数,表示所有经过选定边的树上简单路径中,最长的那条的长度。

样例

输入

7
1 2 3 4 5 3
3 7

输出*

4

思路

树上dfs

由于是一棵树,所以将 (x,y) 这条边删除后,树就被拆分为两棵树。

接着分别以 x 和 y 为根对两棵子树 dfs 求出最大深度即可。

时间复杂度:O(n)

类似题目推荐

这道题是非常经典,也非常"裸"的树上dfs问题。LeetCode上有非常多的例题,并且在2023年春招过程中考了114514次。望周知。

LeetCode

  1. 112. 路径总和

  2. 129. 求根到叶子节点数字之和

  3. 236. 二叉树的最近公共祖先

CodeFun2000

难度依次递增

1.P1141 2023.04.01-美团-第五题-染色の树

2.P1224 携程 2023.04.15-春招-第三题-魔法之树

3.P1159. 2022年清华大学(深圳)保研夏令营机试题-第一题-树上计数

4.P1196 华为 2023-04-19-第二题-塔子哥出城

5.P1044. 拼多多内推笔试-2023.2.22.投喂珍珠

6.P1193. 腾讯音乐 2023.04.13-暑期实习-第二题-价值二叉树

更多请见:知识点分类-训练-深度优先搜索专栏

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
int main()
{
    int n;
    cin >> n;
    // 读入
    vector<vector<int>> g(n);
    for (int i = 2; i <= n; ++i) {
        int p; cin >> p;
        g[p - 1].emplace_back(i - 1);
        g[i - 1].emplace_back(p - 1);
    }
    // C++11特性:匿名函数
    function<int(int,int)> dfs = [&](int u, int fa) {
        int res = 0;
        for (int v: g[u]) {
            if (v == fa) continue;
            res = max(res, dfs(v, u) + 1);
        }
        return res;
    };
​
    int x, y;
    cin >> x >> y;
    x -= 1;
    y -= 1;
    // 拆成两部分dfs
    cout << dfs(x, y) + dfs(y, x) + 1 << "n";
​
    return 0;
}

python

# 读入
n = int(input())
p = list(map(int, input().split(" ")))
g = [[] for i in range(n)]
for i in range(2, n + 1):
    g[i - 1].append(p[i - 2] - 1)
    g[p[i - 2] - 1].append(i - 1)
​
x, y = map(int, input().split(" "))
x -= 1
y -= 1
​
def dfs(u, fa):
    res = 0
    for v in g[u]:
        if v == fa:
            continue
        res = max(res, dfs(v, u) + 1)
    return res
​
# 根据题意拆成两部分
print(dfs(x, y) + dfs(y, x) + 1)

Java

import java.util.*;
​
public class Main {
    static List<List<Integer>> g;
​
    public static void main(String[] args) {
        // 读入
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
​
        g = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            g.add(new ArrayList<>());
        }
        for (int i = 2; i <= n; i++) {
            int p = scanner.nextInt();
            g.get(i - 1).add(p - 1);
            g.get(p - 1).add(i - 1);
        }
        int x = scanner.nextInt() - 1;
        int y = scanner.nextInt() - 1;
        // 根据题意拆成两部分dfs
        System.out.println(dfs(x, y) + dfs(y, x) + 1);
    }
​
    private static int dfs(int u, int fa) {
        int res = 0;
        for (int v : g.get(u)) {
            if (v == fa) {
                continue;
            }
            res = Math.max(res, dfs(v, u) + 1);
        }
        return res;
    }
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('n');
    const n = parseInt(lines[0]);
    const p = lines[1].split(' ').map(Number);
    const g = new Array(n + 5).fill();
    for (var i = 1 ; i <= n ; i++) g[i] = [];
    for (let i = 2; i <= n ; i++) {
        g[i].push(p[i - 2]);
        g[p[i - 2]].push(i);
    }
    let [x, y] = lines[2].split(' ').map(Number);
    console.log(dfs(x, y , g) + dfs(y, x , g) + 1);
});
​
function dfs(u, fa , g) {
    let res = 0;
    for (const v of g[u]) {
        if (v === fa) continue;
        res = Math.max(res, dfs(v, u , g) + 1);
    }
    return res;
}

Go

package main
​
import (
    "bufio"
    "fmt"
    "os"
)
​
func main() {
    sc := bufio.NewReader(os.Stdin)
    var n int
    fmt.Fscanln(sc, &n)
    edges := [][]int{}
    for i := 1; i < n; i++ {
        var pi int
        fmt.Fscan(sc, &pi)
        edges = append(edges, []int{i + 1, pi})
    }
    fmt.Fscanln(sc)
    var x, y int
    fmt.Fscanln(sc, &x, &y)
    test14(n, edges, x, y)
}
​
func test14(n int, edges [][]int, x, y int) {
    // 建图
    graph := map[int][]int{}
    for _, edge := range edges {
        graph[edge[0]] = append(graph[edge[0]], edge[1])
        graph[edge[1]] = append(graph[edge[1]], edge[0])
    }
    // 分别从 x, y 向两边延伸, 分别得到最长的, 相加 + 1
    visitedMap := map[int]bool{}
    var dfs func(node int) int
    dfs = func(node int) int {
        if len(graph[node]) == 0 {
            return 1
        }
        res := 0
        for _, next := range graph[node] {
            if !visitedMap[next] {
                visitedMap[next] = true
                res = max(res, 1+dfs(next))
                visitedMap[next] = false
            }
        }
        return res
    }
    visitedMap[x] = true
    visitedMap[y] = true
    resX, resY := dfs(x), dfs(y)
    fmt.Println(resX + resY + 1)
}
​
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows7 环境下的 Python 版本如何选取?

背景 我需要在不连接互联网的 Windows7 办公电脑上为网页版的办公系统开发一个自动化工具&#xff0c;可以将日常琐碎的操作替代掉。 基本确定了通过 PythonSelenium 的方式来实现网页自动化功能。 首先我需要配置开发环境&#xff0c;安装 Python、VS Code、导入Selenium库、…

提高 React 性能的技巧

1.解决重复渲染问题 我们大多数人都知道虚拟 DOM 是如何工作的&#xff0c;但最重要的是检测何时触发树比较。当我们可以跟踪它时&#xff0c;我们可以控制组件的重新渲染&#xff0c;并最终防止意外的性能流。令人惊讶的是&#xff0c;它并不难捕捉。首先&#xff0c;将 Reac…

uniapp APP端在线升级功能实现讲解——强制或可选升级,下载进度显示

文章目录 概要 需求分析 技术实现梳理 1.是否更新判断&#xff1a; 2.升级弹窗的展示 3.根据升级类型限制操作 4.下载APP监听下载进度 5.下载完自动安装 核心API讲解 1.plus.downloader.createDownload(url,options,completedCallback)&#xff08;下载&#xff09; 2.plus.r…

使用SOCKET搭建linux和window实现实时摄像头传输(linux传输win端使用C++mfc显示)--Win端开发

1.使用MFC搭建框架 配置: Window10VS2013opencv249 如果VS和opencv配置不一样&#xff0c;让版本对应 Opencv与VS版本 1.1 MFC项目搭建 通过这些步骤就创建了一个MFC基础项目。 1.2项目属性配置 本项目因为要使用opencv,所以就要配置以下opencv的环境 首先在opencv官网下载…

手机连接adb 相关问题汇总

目录 关于端口占用问题1 关于修改adb 端口配置问题2 方法3 方法4 关于端口占用问题1 转载链接&#xff1a;https://www.jianshu.com/p/902a89b06271 报错信息&#xff1a; error: no device/emulators found error: device still connecting 解决方案&#xff1a; 重启…

Day_50小结

目录 一. 比较和分析各种查找算法 二. 描述各种排序算法的特点和基本思想&#xff06;比较分析各种排序算法 1. 插入排序 2. 交换排序 3. 选择排序 4. 外部排序 三. 设计一个自己的 Hash 函数和一个冲突解决机制 1. 对于哈希函数的构造&#xff1a; 2. 处理冲突的办法&#…

Mybatis持久层框架 | Lombok搭建

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Lombok Lombok项目是一个java库&#xff0c;它可以自动插入到编辑器和构建工具中&#xff0c;增强java的性能。不需要再写getter、setter或equals方法&#xff0c;只要…

易语言使用node编译的js文件

环境配置 npm install -g cnpm babel-preset-env babel-cli babel-polyfill browserifynpm install -g crypto-js nodejs转js 例如加密模块 browserify -r babel-polyfill -r crypto-js -o es6.txt browserify file.js -o es6.txt易语言 使用v8 推荐 直接生成导入js即…

LMV331TP-TR 滞后比较器实现精确电压比较与判决

文章目录 LMV331TP-TR1. 滞后比较器的基本概念和作用2. LMV331TP-TR 的特性和规格2.1 工作电压范围2.2 输入电压偏置2.3 响应时间 3. LMV331TP-TR 的工作原理3.1 内部结构3.2 滞后器功能的实现原理 4. 实现准确比较和判决的案例 LMV331TP-TR LMV331TP-TR 是一款优秀的滞后比较…

机器学习之逻辑回归模型

1 逻辑回归模型介绍 逻辑回归(Logistic Regression, LR)又称为逻辑回归分析&#xff0c;是一种机器学习算法&#xff0c;属于分类和预测算法中的一种&#xff0c;主要用于解决二分类问题。逻辑回归通过历史数据的表现对未来结果发生的概率进行预测。例如&#xff0c;我们可以将…

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent&#xff08;存储事件&#xff09; 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

chatgpt赋能python:Python自动缩进详解

Python 自动缩进详解 作为一门面向对象的高级编程语言&#xff0c;Python 其中一个非常重要的特性便是自动缩进。Python 中的代码块是通过缩进来表示的&#xff0c;而不是通过括号或其他方式。这对于刚开始学习 Python 的初学者来说可能是很困难的&#xff0c;但一旦掌握了这一…

开好会议的方法 会议达成共识 明确目标,促成共识 单向会议 互动会议 会议讨论,文档先行 会前文档 会中 3D法则讨论 同步会议,跟进代办 举个栗子 企业管理

目录 开好会的方法 明确目标&#xff0c;促成共识 单向会议 互动会议 会议讨论&#xff0c;文档先行 会前文档 会中 3D法则讨论 同步会议&#xff0c;跟进代办 举个栗子 开好会的方法 会议有时候时间很长&#xff0c;很多无意义内容&#xff0c;如何开出有意义有价值…

Linux学习之权限表现

groupadd grouptest1添加一个叫grouptest1的用户组。 useradd gooduser -g grouptest1添加一个叫gooduser 的用户&#xff0c;并把它添加到grouptest1用户组里边&#xff0c;id gooduser看一下用户的信息。 接下来进行测试用户和用户组权限。 普通文件 在root账户下&#xf…

AI Chat 设计模式:2. 工厂设计模式

本文是该系列的第二篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白。 问题列表 Q.1 介绍下工厂设计模式A.1Q.2 这种设计模式有哪几种形式A.2Q.3 使用c写一个简单工厂的例子A.3Q.4 我…

操作受限的线性表——队列

本文主要内容&#xff1a;介绍了队列的基本概念和基本操作&#xff0c;详细介绍了队列的顺序存储和链式存储。并介绍了循环队列和双端队列&#xff08;以及输入/输出受限的双端队列&#xff09;&#xff0c;及其基本操作。 目录 队列一、队列的基本概念1、基本概念2、基本操作…

计算机视觉-目标检测(二):从R-FCN到YOLO-v3

文章目录 1. R-FCN1.1 动机1.2. R-FCN 网络结构1.3. R-FCN 的损失函数1.4. R-FCN的训练及性能 2. YoLO-v12.1 简介2.2 YOLO-v1网络结构2.3 目标函数2.4 YOLO-v1的优缺点 3. YOLO-v23.1 YOLO-v2相比v1的优化 4. YOLO-v3参考 1. R-FCN 论文链接&#xff1a;R-FCN:Object Detecti…

java格式化数字 NumberFormat及DecimalFormat

一、JavaAPI官方描述 1、NumberFormat NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点&#xff0c;千位分隔符的区域设置约定&#xff0c;甚至是使用的特定十进制数字&#xff0c;或者数字格式是否为十进制。 2、 DecimalFormat Decimal…

Linux之YUM管理工具

目录 Linux之YUM管理工具 定义 实现YUM的三个机制 RHEL8中yum源变化说明 案例 示例1 --- 建立本地光盘源&#xff08;本地yum源&#xff09; 示例2 --- 配置互联网源 yum(dnf)工具管理软件包 安装软件包 module子命令 案例 yum-config-manager的使用 定义 yum-conf…

Linux系统如何配置网络

Linux系统的三种网络模式&#xff1a; 桥接&#xff1a;可以和外部设备通信&#xff0c;主机和Ubuntu分别使用不同的IP地址NAT&#xff1a;可以和外部设备通信&#xff0c;主机和Ubuntu公用一个IP地址主机&#xff1a;只能和主机通信 在此我们介绍如何配置桥接网络&#xff1…