ホームページ >バックエンド開発 >PHPチュートリアル >ノードをグループの最大数に分けます
2493。ノードをグループの最大数に分けます
難易度:hard
トピック:幅第一検索、Union Find、Graph
無向グラフのノードの数を表す正の整数nが与えられます。ノードのラベルは1からn。
です また、2D整数アレイエッジも与えられます。ここでは、エッジ[i] = [ai、bi]は、双方向ノードの間のエッジa iとbi 。 指定されたグラフが切断される可能性があることに注意 グラフのノードをMグループ(
1インダックス)に分割して、次のようにしてください。 グラフ内の各ノードは、正確に1つのグループに属します。 エッジで接続されているグラフ内のノードのすべてのペア[a
iinput:
n = 6、edges = [[1,2]、[1,4]、[1,5]、[2,6]、[2,3]、[4,6] ]
output:4
-1
説明:1< = a i、B a
問題、
「ノードをグループの最大数に分割する」には、対応のないグラフのノードを分割できるグループの最大数を決定することを伴います。 各ノードは、正確に1つのグループに属します。
隣接リストを使用してグラフを表します。 組合ファインドを使用して、接続されたコンポーネントを識別します。
接続されている各コンポーネントについて、BFSを使用して、それが二倍であるかどうかを判断します。 それが二倍でない場合、-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 ?>
ユニオンファインド(Disjoint Set Union)構造グループノードを接続されたコンポーネントにグループ化し、2つの主要なタスクを実行します。
手順:
$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]コンポーネント1:Bipartite。最大深さ=4。
手順:
$n = 3; $edges = [[1,2], [2,3], [3,1]];隣接するコンストラクトリスト:
1 -> [2, 3] 2 -> [1, 3] 3 -> [1, 2]コンポーネント1:bipartiteではありません。
$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
github
以上がノードをグループの最大数に分けますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。