0

0

将节点分为最大组数

聖光之護

聖光之護

发布时间:2025-01-30 14:36:01

|

731人浏览过

|

来源于dev.to

转载

2493。将节点分为最大组

>

难度: hard

>主题:广度优先搜索,联合查找,图形

>给您一个正整数n,代表无向图中的节点的数量。节点从1到n。 >您还会给您一个2d整数数组边缘,其中边缘[i] = [a

i

,bi>]表示存在bivecrectional 节点ai 和bi之间的边缘。 通知可以断开给定的图。> 将图的节点划分为m组(

1个索引

),这样的节点是:>

图中的每个节点完全属于一个组。
    >
  • 对于图中的每个节点,由边缘连接的[a
  • i
  • ,b i]使用索引x,bi属于索引y的组,然后| y -x | = 1.返回>您可以将节点划分的最大组数(即最大值)。返回
  • -1如果不可能将节点与给定条件

分组 >>示例1:

>输入: n = 6,edges = [[1,2],[1,4],[1,5],[2,6],[2,3],[4,6] ]

example1

>输出:
    4
  • >说明:
  • >如图所示:
  • >将节点5添加到第一个组。
  • >将节点1添加到第二组。
  • >将节点2和4添加到第三组。
      >将节点3和6添加到第四组。
    • >
    • 我们可以看到每个边缘都可以满足。
    • >可以证明,如果我们创建第五组并将任何节点从第三或第四组移动到其中,那么至少在边缘上都无法满足。
    • >
    • >
    • >示例2:
  • >输入:
n = 3,edges = [[1,2],[2,3],[3,1]]

>输出:

-1
  • >说明:如果将节点1添加到第一个组,将节点2添加到第二组中,然后将节点3添加到第三组以满足前两个边缘,我们可以看到,第三个边缘将不满足第三个边缘。
  • 可以证明不可能分组。
  • >约束:
    • >
    1
1 4

edges [i] .length == 2
  • 1 i
  • ,b i
  • a
  • i
  • != bi> 在任何一对顶点之间最多都有一个边缘。
  • >
  • 提示:
  • 如果图不是双分,则不可能分组节点。>请注意,我们可以独立解决每个连接的组件的问题,最终答案将只是每个组件中最大组的总数。>

>最后,要解决每个连接的组件的问题,我们可以注意到,如果对于某个节点v,我们将其位置固定在最左边的组中,那么我们也可以评估其他每个节点的位置。该位置是扎根在节点v。

解决方案:
  1. 问题,
  2. “将节点分为最大组数”
  3. ,涉及确定可以将无向图的节点划分为:
  4. 的最大组数。
每个节点恰好属于一个组。 相邻节点的

组成的索引恰好有1个。 如果该图不是双分部分,则不可能进行分组,并且该函数必须返回-1。

>关键点

    图形属性:
  1. 该图可以断开连接。
  2. >
  3. >验证:
对于每个连接的组件,检查它是否是双分。如果没有,返回-1。

>二分性质:

解决方案涉及bfs以验证双方。
  • 联合 - 芬德:有效地分组连接的组件。>
  • 方法
  • 预处理:
  • 使用邻接列表表示图形。

>使用union-find来识别连接的组件。

  1. bfs验证两肢:>

    对于每个连接的组件,请使用bfs确定它是否为双分。
      如果不是双分,请返回-1。
  2. >计算组计数:
  3. 对于每个连接的组件,使用bfs确定最大深度,代表组的最大数量。

    • 组合结果:
    概括所有两部分组件的最大组计数。
  4. >
  5. 计划
    构建图形作为邻接列表。
  6. >使用union-find对组连接的组件。

    图中每个节点的>:

    >使用bfs检查图形是否是双分部分,并计算该组件的最大深度。
    >作为结果,返回所有组件深度的总和。如果任何组件不是双方,请返回-1。

>让我们在php中实现此解决方案: 2493。将节点划分为最大组数>

<?php
/**
 * @param integer $n
 * @param integer[][] $edges
 * @return integer
 */
function magnificentsets($n, $edges) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * @param $graph
 * @param $u
 * @return int
 */
private function bfs($graph, $u) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

class unionfind {
    /**
     * @var array
     */
    private $id;
    /**
     * @var array
     */
    private $rank;

    /**
     * @param $n
     */
    public function __construct($n) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * @param $u
     * @param $v
     * @return void
     */
    public function unionbyrank($u, $v) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * @param $u
     * @return mixed
     */
    public function find($u) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }
}


// example usage:
$n = 6;
$edges = [[1,2], [1,4], [1,5], [2,6], [2,3], [4,6]];
echo maxgroups($n, $edges); // output: 4

$n = 3;
$edges = [[1,2], [2,3], [3,1]];
echo maxgroups($n, $edges); // output: -1
?>
    解释:
  1. 1。 union-find类
    • > union-find(不连接集合联合)结构将节点组为连接的组件,并执行两个主要任务:
  2. find:
  3. >标识节点连接的组件的根。
联合:

>根据等级合并两个连接的组件。

2。 bfs用于两分和深度计算

>二分化验证:

使用bfs,为节点分配交替的“颜色”。如果相邻的节点共享相同的颜色,则该图不是两部分。

>

    >深度计算:
  • >测量bfs树的深度以确定组的最大数量。
  • 3。结合结果
  • 计算每个连接的组件的最大深度。
>

添加所有组件的深度以确定结果。

示例演练
  • >示例1
  • 输入:
  • $n = 6;  
    $edges = [[1,2], [1,4], [1,5], [2,6], [2,3], [4,6]];
    
步骤:

>构造邻接列表:

       1 -> [2, 4, 5]
       2 -> [1, 3, 6]
       3 -> [2]
       4 -> [1, 6]
       5 -> [1]
       6 -> [2, 4]
    
  • >在连接的组件上使用bfs:
  • 组件1:两分。最大深度= 4

所有组件中的总和深度:4。 >输出:4

>示例2

输入:

$n = 3;  
$edges = [[1,2], [2,3], [3,1]];

步骤:

极限网络办公Office Automation
极限网络办公Office Automation

专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬

下载
  1. >构造邻接列表:
   1 -> [2, 3]
   2 -> [1, 3]
   3 -> [1, 2]
  1. 使用bfs:
    • 组件1:不是双方。
  2. >输出:-1

时间复杂度

图形结构:

o(e)

    ,其中
    e
    • 是边缘的数量。
    • >
  1. >联合 - find:

o(α(n)) ,其中

  • n 是节点的数量(由于路径压缩而几乎恒定)。 bfs:o(v e)
  • ,其中
  • v 是顶点的数量。 总体复杂性:o(n e)>
  • >输出示例
    $n = 6;
    $edges = [[1,2], [1,4], [1,5], [2,6], [2,3], [4,6]];
    echo magnificentSets($n, $edges); // Output: 4
    
    $n = 3;
    $edges = [[1,2], [2,3], [3,1]];
    echo magnificentSets($n, $edges); // Output: -1
    
    这种方法通过利用bfs进行两性检查和深度计算来有效地处理分组问题,同时利用union-find来简化组件管理。该解决方案处理连接和断开的图形。
    联系链接 如果您发现此系列有帮助,请考虑在github上给出 reposority cository >在您喜欢的社交网络上分享帖子。您的支持对我来说意义重大!> 如果您想要这样的更多有用的内容,请随时关注我:>

linkedin

github

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

129

2023.09.27

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4126

2026.01.21

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

412

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

143

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.2万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号