ΠΠ°Π΄Π°ΡΠ° - 2493. Divide Nodes Into the Maximum Number of Groups.
π ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ Π½Π΅ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π³ΡΠ°Ρ Ρ n
Π²Π΅ΡΡΠΈΠ½Π°ΠΌΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΡΠ²ΡΠ·Π½ΡΠΉ. Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°Π·Π±ΠΈΡΡ Π²Π΅ΡΡΠΈΠ½Ρ Π½Π° m
Π³ΡΡΠΏΠΏ, ΡΠΎΠ±Π»ΡΠ΄Π°Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ:
β ΠΠ°ΠΆΠ΄Π°Ρ Π²Π΅ΡΡΠΈΠ½Π° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅.
β ΠΡΠ»ΠΈ Π²Π΅ΡΡΠΈΠ½Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Ρ ΡΠ΅Π±ΡΠΎΠΌ [a, b]
, ΡΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠΌΠ΅ΠΆΠ½ΡΡ
Π³ΡΡΠΏΠΏΠ°Ρ
(|group[a] - group[b]| = 1
).
β ΠΠ°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΈΡ
Π³ΡΡΠΏΠΏ m
.
β ΠΠ΅ΡΠ½ΡΡΡ -1
, Π΅ΡΠ»ΠΈ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

π‘ ΠΠ΄Π΅Ρ
- ΠΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΡ Π½Π° Π³ΡΡΠΏΠΏΡ β ΠΎΠ½ Π΄Π²ΡΠ΄ΠΎΠ»ΡΠ½ΡΠΉ.
- ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π³ΡΡΠΏΠΏ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π³Π»ΡΠ±ΠΈΠ½ΠΎΠΉ BFS Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅.
- ΠΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ BFS ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π½Π°ΠΈΠ»ΡΡΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΠΊΠΎΡΠ΅Π½Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ.
π ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- Π‘ΡΡΠΎΠΈΠΌ Π³ΡΠ°Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ° ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ.
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ
BFS
ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ (Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅) Π΄Π»Ρ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄Π²ΡΠ΄ΠΎΠ»ΡΠ½ΠΎΡΡΠΈ (ΠΏΠΎ ΡΡΠΎΠ²Π½ΡΠΌ
BFS
).
- ΠΠΎΠΈΡΠΊΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π³Π»ΡΠ±ΠΈΠ½Ρ
BFS
(max_level
).
- ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (
min_index
).
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ
HashMap
Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²ΡΡΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ.
- ΠΡΠ»ΠΈ Ρ
ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π΅ Π΄Π²ΡΠ΄ΠΎΠ»ΡΠ½Π°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ
-1
.
- Π‘ΡΠΌΠΌΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠΎΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
β³ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(N Γ E)
- ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ΅Π±ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ Π΄ΠΎ
N
ΡΠ°Π·, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌ Π³ΡΠ°Ρ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ.
- ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(N + E)
O(N + E)
Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ° ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ.
O(N)
Π΄Π»Ρ BFS-ΡΡΡΡΠΊΡΡΡ (level
, queue
).
O(N)
Π΄Π»Ρ heights
(HashMap, Ρ
ΡΠ°Π½ΡΡΠΈΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΎΠ΄Π½Ρ Π·Π°ΠΏΠΈΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ).
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
use std::collections::{VecDeque, HashMap};
impl Solution {
pub fn magnificent_sets(n: i32, edges: Vec<Vec<i32>>) -> i32 {
let n = n as usize;
let mut graph = vec![vec![]; n];
// Build adjacency list representation of the graph
for edge in edges {
let (u, v) = ((edge[0] - 1) as usize, (edge[1] - 1) as usize);
graph[u].push(v);
graph[v].push(u);
}
let mut heights = HashMap::new(); // Store the maximum height for each component
// Iterate over all nodes, attempting to maximize height for each connected component
for start in 0..n {
if let Some((component_id, height)) = Self::bfs_check_and_find_height(start, &graph) {
heights.entry(component_id)
.and_modify(|h| *h = height.max(*h))
.or_insert(height);
} else {
return -1; // If any component is not bipartite, return -1
}
}
heights.values().sum()
}
// Performs BFS from `start` to determine if the graph is bipartite
// and find the maximum height in its connected component.
fn bfs_check_and_find_height(start: usize, graph: &[Vec<usize>]) -> Option<(usize, i32)> {
let mut level = vec![0 as i32; graph.len()]; // Track BFS levels
let mut queue = VecDeque::new();
queue.push_back(start);
level[start] = 1;
let mut max_level = 1; // Track the deepest BFS level reached
let mut min_index = start;
while let Some(v) = queue.pop_front() {
max_level = level[v]; // Update the deepest level reached
min_index = min_index.min(v);
// Traverse neighbors and check bipartiteness
for &u in &graph[v] {
if level[u] == 0 { // First visit to `u`
level[u] = level[v] + 1;
queue.push_back(u);
} else if level[u].abs_diff(level[v]) != 1 { // Bipartiteness check
return None // Graph is not bipartite
}
}
}
Some((min_index, max_level))
}
}
Tags: #rust #algorightms #graph #bfs