Rumah >pembangunan bahagian belakang >tutorial php >Bahagikan nod ke dalam bilangan maksimum kumpulan
2493. Bahagikan nod ke dalam bilangan maksimum kumpulan
Kesukaran: Hard
topik: carian lebar-pertama, kesatuan mencari, graf
anda diberi integer positif n mewakili bilangan nod dalam graf yang tidak diarahkan . Nod dilabel dari 1 hingga n.
Anda juga diberi tepi array integer 2D, di mana tepi [i] = [a i , b i ] menunjukkan bahawa terdapat bidirectional Edge antara nod A i dan b i . notis bahawa graf yang diberikan boleh diputuskan.
Bahagikan nod graf ke dalam kumpulan M ( 1-indeks ) seperti itu:
-1 jika mustahil untuk mengelompokkan nod dengan syarat-syarat yang diberikan . Contoh 1:
input:
input: n = 3, tepi = [[1,2], [2,3], [3,1]]
1 & lt; = n & lt; = 500 1 & lt; = edges.length & lt; = 10
4Penyelesaian:
Masalah, "Bahagikan nod ke dalam bilangan maksimum kumpulan" , melibatkan menentukan bilangan maksimum kumpulan yang mana nod graf yang tidak diarahkan dapat dibahagikan, sehingga:
preprocessing:
bfs untuk mengesahkan bipartiteness:
Kirakan kiraan kumpulan:
Gabungkan hasil:
mari kita melaksanakan penyelesaian ini dalam php: 2493. Bahagikan nod ke dalam bilangan maksimum kumpulan
<?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 ?>
kumpulan struktur kesatuan (disjoint set kesatuan) nod ke komponen yang bersambung dan melakukan dua tugas utama:
input:
$n = 6; $edges = [[1,2], [1,4], [1,5], [2,6], [2,3], [4,6]];Langkah -langkah:
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]];
Membina Senarai Adjacency:
1 -> [2, 3] 2 -> [1, 3] 3 -> [1, 2]Gunakan BFS:
kerumitan masa
$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
Pautan kenalan
Jika anda mendapati siri ini membantu, sila pertimbangkan untuk memberikan repositori
bintang di GitHub atau berkongsi jawatan di rangkaian sosial kegemaran anda? Sokongan anda sangat bermakna bagi saya!Jika anda mahukan kandungan yang lebih berguna seperti ini, jangan ragu untuk mengikuti saya:
Atas ialah kandungan terperinci Bahagikan nod ke dalam bilangan maksimum kumpulan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!