главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

Π—Π°Π΄Π°Ρ‡Π° - 2493. Divide Nodes Into the Maximum Number of Groups.

πŸ“Œ ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π½ Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ с n Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ нСсвязный. ВрСбуСтся Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π½Π° m Π³Ρ€ΡƒΠΏΠΏ, соблюдая условия:
βœ” КаТдая Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅.
βœ” Если Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ соСдинСны Ρ€Π΅Π±Ρ€ΠΎΠΌ [a, b], Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² смСТных Π³Ρ€ΡƒΠΏΠΏΠ°Ρ… (|group[a] - group[b]| = 1).
βœ” Найти максимальноС количСство Ρ‚Π°ΠΊΠΈΡ… Π³Ρ€ΡƒΠΏΠΏ m.
βœ” Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ -1, Ссли Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

πŸ’‘ ИдСя

πŸ” Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. Π‘Ρ‚Ρ€ΠΎΠΈΠΌ Π³Ρ€Π°Ρ„ Π² Π²ΠΈΠ΄Π΅ списка смСТности.
  2. ЗапускаСм BFS ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ (Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅) для:
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄Π²ΡƒΠ΄ΠΎΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΏΠΎ уровням BFS).
    • Поиска максимальной Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ BFS (max_level).
    • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (min_index).
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ HashMap для хранСния максимальной высоты ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.
  4. Если хотя Π±Ρ‹ ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π΅ Π΄Π²ΡƒΠ΄ΠΎΠ»ΡŒΠ½Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ -1.
  5. Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ высоты ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

⏳ Асимптотика

πŸ’» Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

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