搜索
首页后端开发php教程合并两棵树后找到最小直径

3203。合并两棵树后找到最小直径

难度:

主题:树、深度优先搜索、广度优先搜索、图

存在两棵无向树,分别有n和m个节点,编号分别为0到n - 1和0到m - 1。给定两个二维整数数组edges1和edges2,长度分别为n - 1和m - 1,其中edges1[i] = [ai, bi]表示有是第一棵树中节点 ai 和 bi 之间的边,edges2[i] = [ui, vi] 表示第二棵树中的节点 ui 和 vi 之间有一条边。

您必须使用边将第一棵树中的一个节点与第二棵树中的另一个节点连接起来。

返回所得树最小值可能的直径

树的直径是树中任意两个节点之间最长路径的长度。

示例1:

Find Minimum Diameter After Merging Two Trees

  • 输入: Edges1 = [[0,1],[0,2],[0,3]], Edges2 = [[0,1]]
  • 输出: 3
  • 说明:通过将第一棵树的节点 0 与第二棵树的任意节点连接,我们可以得到一棵直径为 3 的树。

示例2:

Find Minimum Diameter After Merging Two Trees

  • 输入:edges1 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2, 7]],边2 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]]
  • 输出: 5
  • 说明:通过将第一棵树的节点 0 与第二棵树的节点 0 连接起来,我们可以得到一棵直径为 5 的树。

约束:

  • 1 5
  • edges1.length == n - 1
  • edges2.length == m - 1
  • edges1[i].length == Edges2[i].length == 2
  • edges1[i] = [ai, bi]
  • 0 i, bi
  • edges2[i] = [ui, vi]
  • 0 i, vi
  • 生成输入,使得edge1和edge2代表有效的树。

提示:

  1. 假设我们将tree1中的节点a与tree2中的节点b连接起来。生成的树的直径长度将是以下 3 个值中最大的一个:
    1. 树的直径1.
    2. 树的直径2.
    3. 从节点 a 开始且完全在树 1 内的最长路径的长度 从节点 b 开始且完全在树 2 内的最长路径的长度 1.
    4. 第三个值中添加的一个是由于我们在树 1 和 2 之间添加了额外的边。
  2. 无论我们选择 a 和 b,值 1 和 2 都是恒定的。因此,我们需要以最小化值 3 的方式选择 a 和 b。
  3. 如果我们选择最佳的 a 和 b,它们将分别位于 Tree 1 和 Tree 2 的直径内。我们到底应该选择哪些直径的节点?
  4. a 是树 1 的直径中心,b 是树 2 的直径中心。

解决方案:

我们需要逐步解决它,重点是了解如何计算树的直径以及连接两棵树如何影响总直径。

解决步骤:

  1. 求每棵树的直径:

    • 树的直径是任意两个节点之间最长的路径。为了找到它,我们可以使用以下两步过程:
      1. 从任意节点执行 BFS(或 DFS)以找到最远的节点(我们将此节点称为 A)。
      2. 从A开始再进行一次BFS(或DFS),找到距离A最远的节点(我们称这个节点为B),A到B的距离就是树的直径。
  2. 确定最佳连接节点:

    • 从问题的提示来看,连接两棵树时最小化附加直径的最佳方法是连接两棵树的直径中心。这将最大限度地减少新边造成的最长路径。
    • 树直径中的最佳节点通常是“中心”,可以通过从直径的端点执行 BFS 并找到最长路径的中间来找到它。
  3. 最小化总直径:

    • 一旦我们找到两棵树的中心,新的直径就是以下值中的最大值:
      • 树 1 的直径。
      • 树 2 的直径。
      • 树 1 中的最长路径、树 2 中的最长路径以及新连接边 1 的总和。

让我们用 PHP 实现这个解决方案:3203。合并两棵树后求最小直径

<?php /**
 * @param Integer[][] $edges1
 * @param Integer[][] $edges2
 * @return Integer
 */
function minimumDiameterAfterMerge($edges1, $edges2) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Helper function to find the diameter of a tree and the farthest node from a start node
 *
 * @param $n
 * @param $edges
 * @param $start
 * @return array
 */
function bfs($n, $edges, $start) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Helper function to find the diameter of a tree and its center
 *
 * @param $n
 * @param $edges
 * @return array
 */
function getDiameterAndCenter($n, $edges) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Example 1
$edges1 = [[0,1],[0,2],[0,3]];
$edges2 = [[0,1]];
echo minimumDiameterAfterMerge($edges1, $edges2);  // Output: 3

// Example 2
$edges1 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]];
$edges2 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]];
echo minimumDiameterAfterMerge($edges1, $edges2);  // Output: 5
?>

解释:

  1. BFS 辅助函数:bfs 函数计算距离给定起始节点最远的节点,并返回距离数组和找到的最远节点。这对于计算树的直径至关重要。

  2. 获取直径和中心:getDiameterAndCenter 函数查找树的直径及其中心。合并两棵树时,树的中心对于最小化新树的直径至关重要。

  3. 主要解决方案

    • 我们首先为两棵树构建邻接表。
    • 我们计算两棵树的直径和中心。
    • 我们从两棵树的中心执行 BFS,以获得每棵树内的最长路径。
    • 最后,我们计算三个值中的最大值,得到合并树的最小直径。

时间复杂度:

  • 构建邻接表:O(n·m)
  • BFS 遍历:O(n·m)
  • 总体时间复杂度为 O(n m),对于 105.
  • 输入大小限制是有效的

这种方法确保我们在合并两棵树时找到尽可能小的直径。

联系链接

如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

以上是合并两棵树后找到最小直径的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

在Laravel中发现文件下载的存储::下载在Laravel中发现文件下载的存储::下载Mar 06, 2025 am 02:22 AM

Laravel框架的Storage::download方法提供了一个简洁的API,用于安全地处理文件下载,同时管理文件存储的抽象。 以下是一个在示例控制器中使用Storage::download()的例子:

如何注册和使用Laravel服务提供商如何注册和使用Laravel服务提供商Mar 07, 2025 am 01:18 AM

Laravel的服务容器和服务提供商是其架构的基础。 本文探讨了服务容器,详细信息服务提供商创建,注册,并通过示例演示了实际用法。 我们将从OVE开始

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。