2493。将节点分为最大组
>难度: hard
>主题:广度优先搜索,联合查找,图形
>给您一个正整数n,代表无向图中的节点的数量。节点从1到n。 >您还会给您一个2D整数数组边缘,其中边缘[i] = [a
i,bi>]表示存在bivecrectional 节点ai 和bi之间的边缘。 通知可以断开给定的图。> 将图的节点划分为M组(
1个索引),这样的节点是:>
图中的每个节点完全属于一个组。分组
>>示例1:
>输入:
>输出:
>输出:
-1edges [i] .length == 2
问题,
“将节点分为最大组数”,涉及确定可以将无向图的节点划分的最大组数,以:
每个节点恰好属于一个组。使用邻接列表表示图形。 >使用Union-Find来识别连接的组件。
如果不是双分,请返回-1。
组合结果:
计划
<?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 ?>
> Union-Find(不连接集合联合)结构将节点组为连接的组件,并执行两个主要任务:
步骤:
$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]
输入:
>构造邻接列表:
$n = 3; $edges = [[1,2], [2,3], [3,1]];
1 -> [2, 3] 2 -> [1, 3] 3 -> [1, 2]
$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上给出 >
>
以上是将节点分为最大组数的详细内容。更多信息请关注PHP中文网其他相关文章!