题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛

小蓝正在和朋友们团建,有一个游戏项目需要两人合作,两个人分别拿到一棵大小为 n 和 m 的树,树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, · · · , c_n c1,c2,⋅⋅⋅,cn, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_2, · · · , d_m d1,d2,⋅⋅⋅,dm。两个人需要从各自树的根结点 1 出发走向某个叶结点,从根到这个叶结点的路径上经过的所有结点上的权值构成了一个正整数序列,两人的序列的最长公共前缀即为他们的得分。给出两棵树,请计算两个人最多的得分是多少。

问题分析

输入:

  • 两棵树的节点权值数组 c 和 d,分别表示第一棵树和第二棵树的节点权值。
  • 树的节点编号从 1 到 n(或 m),根节点是 1。
  • 树的结构通过邻接表表示。

目标:
从根节点到叶节点的路径中,找到两棵树路径序列的最长公共前缀(LCP)。

方法:

  • 使用深度优先搜索(DFS)遍历两棵树,生成所有从根节点到叶节点的路径。
  • 对于每对路径,计算它们的最长公共前缀。
  • 找到所有路径对中的最大 LCP。

示例

// 示例输入
vector<int> c = {1, 2, 3, 4, 5, 6}; // 第一棵树的节点权值
vector<int> d = {1, 2, 3, 4, 7, 6}; // 第二棵树的节点权值

// 第一棵树的邻接表
vector<vector<int>> tree1 = {
    {},          // 节点 0(未使用)
    {2, 3},      // 节点 1 的子节点
    {4, 5},      // 节点 2 的子节点
    {6},         // 节点 3 的子节点
    {},          // 节点 4
    {},          // 节点 5
    {}           // 节点 6
};

// 第二棵树的邻接表
vector<vector<int>> tree2 = {
    {},          // 节点 0(未使用)
    {2, 3},      // 节点 1 的子节点
    {4, 7},      // 节点 2 的子节点
    {6},         // 节点 3 的子节点
    {},          // 节点 4
    {},          // 节点 5
    {},          // 节点 6
    {}           // 节点 7
};

解题思路

  • DFS 函数
    • 使用递归实现深度优先搜索,生成从根节点到叶节点的所有路径。
    • 路径存储在 paths 中。
  • 最长公共前缀函数
    • 比较两个路径序列的节点权值,找到最长公共前缀的长度。
  • 最大得分函数
    • 生成两棵树的所有路径。
    • 遍历所有路径对,计算它们的 LCP,并找到最大值。
  • 主函数
    • 定义树的邻接表和节点权值数组。
    • 调用 maxScore 函数计算最大得分。

C++实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 生成从根节点到叶节点的所有路径
void dfs(int node, vector<int>& path, vector<vector<int>>& paths, const vector<vector<int>>& tree) {
    path.push_back(node); // 将当前节点加入路径
    if (tree[node].empty()) { // 如果是叶节点
        paths.push_back(path); // 将当前路径加入结果
    } else {
        for (int child : tree[node]) { // 遍历子节点
            dfs(child, path, paths, tree);
        }
    }
    path.pop_back(); // 回溯
}

// 计算两个序列的最长公共前缀长度
int longestCommonPrefix(const vector<int>& seq1, const vector<int>& seq2, const vector<int>& c, const vector<int>& d) {
    int len = min(seq1.size(), seq2.size());
    for (int i = 0; i < len; i++) {
        if (c[seq1[i] - 1] != d[seq2[i] - 1]) { // 比较权值
            return i;
        }
    }
    return len;
}

// 计算最大得分
int maxScore(const vector<vector<int>>& tree1, const vector<vector<int>>& tree2, const vector<int>& c, const vector<int>& d) {
    // 生成第一棵树的所有路径
    vector<vector<int>> paths1;
    vector<int> path1;
    dfs(1, path1, paths1, tree1);

    // 生成第二棵树的所有路径
    vector<vector<int>> paths2;
    vector<int> path2;
    dfs(1, path2, paths2, tree2);

    // 计算所有路径对的最长公共前缀
    int maxLCP = 0;
    for (const auto& p1 : paths1) {
        for (const auto& p2 : paths2) {
            int lcp = longestCommonPrefix(p1, p2, c, d);
            maxLCP = max(maxLCP, lcp);
        }
    }

    return maxLCP;
}

复杂度分析

  • 时间复杂度
    • 生成路径: O ( N + M ) O(N+M) O(N+M),其中 N N N M M M 分别是两棵树的节点数。
    • 计算 LCP: O ( P 1 × P 2 × L ) O(P _1×P_2 ×L) O(P1×P2×L),其中 P 1 P_1 P1 P 2 P_2 P2 是路径数,L 是路径的平均长度。
  • 空间复杂度
    • 存储路径: O ( P 1 × L + P 2 × L ) O(P_1 ×L+P_2 ×L) O(P1×L+P2×L)

总结

  • 通过 DFS 遍历生成路径,结合 LCP 计算,可以高效地解决这个问题。
  • 代码实现清晰,逻辑简单,适用于树结构的问题。
  • 该方法的复杂度在合理范围内,能够处理中等规模的输入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复试准备日常

实验室目前投了 aiot 这周四 感知计算面试3.5号下午2点开始&#xff08;面完了他问我有没有项目&#xff09; 532图像处理实验室&#xff08;我的项目大多也是图像处理的&#xff09;&#xff08;预计下周末&#xff09;提前到3.4号下午6点 我不在第一批里面 软专不知道要几个 …

HiRT:利用分层机器人Transformer 增强机器人控制

25年2月来自清华、伯克利分校和上海姚期智研究院的论文“HiRT: Enhancing Robotic Control with Hierarchical Robot Transformers”。 大型视觉-语言-动作 (VLA) 模型利用强大的预训练视觉-语言模型 (VLM) 后端&#xff0c;由于其深刻的泛化能力而在机器人控制方面显示出良好…

Netty笔记3:NIO编程

Netty笔记1&#xff1a;线程模型 Netty笔记2&#xff1a;零拷贝 Netty笔记3&#xff1a;NIO编程 Netty笔记4&#xff1a;Epoll Netty笔记5&#xff1a;Netty开发实例 Netty笔记6&#xff1a;Netty组件 Netty笔记7&#xff1a;ChannelPromise通知处理 Netty笔记8&#xf…

MySQL-高级查询

查询处理 排序&#xff08;默认不是按主键排序的&#xff09; order by 字段1[&#xff0c;字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段&#xff0c;那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数&#xff0…

解决各大浏览器中http地址无权限调用麦克风摄像头问题(包括谷歌,Edge,360,火狐)后续会陆续补充

项目场景&#xff1a; 在各大浏览器中http地址调用电脑麦克风摄像头会没有权限&#xff0c;http协议无法使用多媒体设备 原因分析&#xff1a; 为了用户的隐私安全&#xff0c;http协议无法使用多媒体设备。因为像摄像头和麦克风属于可能涉及重大隐私问题的API&#xff0c;ge…

权限系统设计方案实践(Spring Security + RBAC 模型)

前言 权限系统设计基本上是所有项目中都会涉及的一个重要部分。通过权限系统&#xff0c;我们将对用户角色、功能模块访问进行限制&#xff0c;从而保证系统安全性。本文将介绍中大型项目中常用的一套权限系统设计方案&#xff0c;通过 SpringSecurity 安全管理框架&#xff0c…

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…

植物大战僵尸杂交版v3.3最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.3版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/6f2a…

GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析

引言&#xff1a;大语言模型计算基础设施的演进 随着大语言模型&#xff08;LLM&#xff09;的快速发展与广泛应用&#xff0c;高性能计算硬件已成为支撑LLM训练与推理的关键基础设施。目前市场上主要有三类处理器用于加速LLM相关任务&#xff1a;GPU&#xff08;图形处理单元…

计算机网络数据传输探秘:包裹如何在数字世界旅行?

计算机网络数据传输探秘:包裹如何在数字世界旅行? 一、从快递网络看数据传输本质 想象你网购了一件商品: 打包:商家用纸箱包装,贴上地址标签(数据封装)运输:包裹经过网点→分拣中心→运输车(网络节点与链路)签收:快递员核对信息后交付(数据校验与接收)数据的网络…

VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)

VirtualBox虚拟机里安装好Big Sur版本&#xff0c;尝试升级到Sequoia&#xff0c;但是最终失败了。 软件升级 直接在系统偏好-软件更新里可以看到提示&#xff0c;提示可以升级到15版本Sequoia 点击同意&#xff0c;看能不能升级到Sequoia吧。升级前先用时光做了备份。 升级…

从数据到决策,永洪科技助力良信电器“智”领未来

在数字经济浪潮汹涌的时代&#xff0c;数字化转型已成为企业增强竞争力、实现可持续发展的必由之路。良信电器&#xff0c;作为国内知名的电气设备制造企业&#xff0c;积极响应时代号召&#xff0c;携手永洪科技&#xff0c;共同开启了数字化转型的新篇章。 上海良信电器股份有…

dify接入语音转文本模型后报错: microphone not authorized

遇到microphone not authorized莫慌,这是因为没有获取到设备的麦克风权限导致的 解决方法:&#xff08;三种选其一&#xff0c;我实际使用的是第三种&#xff09; 1.将http路径转换成https 2.接入的前端增加获取麦克风权限的功能 3.打开设备麦克风权限:&#xff08;能快速验证…

华为hcia——Datacom实验指南——配置手工模式以太网链路聚合

什么是以太网链路聚合&#xff08;Eth-trunk&#xff09; 是一种将多个物理链路捆绑在一起&#xff0c;让设备以为是一条大链路&#xff0c;能够增加带宽&#xff0c;增加冗余度&#xff0c;提升可靠性&#xff0c;实现负载平衡。 传输方式有两种 基于数据流传输和基于数据包…

【随手笔记】利尔达NB模组

1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…

RNN实现精神分裂症患者诊断(pytorch)

RNN理论知识 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09; 是一种 专门用于处理序列数据&#xff08;如时间序列、文本、语音、视频等&#xff09;的神经网络。与普通的前馈神经网络&#xff08;如 MLP、CNN&#xff09;不同&#xff0c;RNN…

阿里万相,正式开源

大家好&#xff0c;我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门&#xff0c;而且还是免费向所有人敞开的那种。 你想想看&#xff0c;在这个科技飞速发展的时代&#xff0c;AI就像是拥有神奇魔法的魔法师&#xff0c;不断地给我们带来各种意想…

json介绍、python数据和json数据的相互转换

目录 一 json介绍 json是什么&#xff1f; 用处 Json 和 XML 对比 各语言对Json的支持情况 Json规范详解 二 python数据和json数据的相互转换 dumps() : 转换成json loads(): 转换成python数据 总结 一 json介绍 json是什么&#xff1f; 实质上是一条字符串 是一种…

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 F. SearXNG配置 注意&#xff1a;此…

Linux中死锁问题的探讨

在 Linux 中&#xff0c;死锁&#xff08;Deadlock&#xff09; 是指多个进程或线程因为竞争资源而相互等待&#xff0c;导致所有相关进程或线程都无法继续执行的状态。死锁是一种严重的系统问题&#xff0c;会导致系统资源浪费&#xff0c;甚至系统崩溃。 死锁的定义 死锁是指…