From 909d89a2974c96336dcaf8fb9fca870f3e3389ab Mon Sep 17 00:00:00 2001 From: jackfiled Date: Wed, 28 May 2025 14:15:13 +0800 Subject: [PATCH] 20250528 finished. --- src/problem/mod.rs | 2 + ...f_target_nodes_after_connecting_trees_i.rs | 113 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 src/problem/p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 1c6e6af..2c54675 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -680,3 +680,5 @@ mod p2131_longest_palindrome_by_concatenating_two_letter_words; mod p1857_largest_color_value_in_a_directed_graph; mod p2894_divisible_and_non_divisible_sums_difference; + +mod p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i; diff --git a/src/problem/p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i.rs b/src/problem/p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i.rs new file mode 100644 index 0000000..f74968c --- /dev/null +++ b/src/problem/p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i.rs @@ -0,0 +1,113 @@ +/** + * [3372] Maximize the Number of Target Nodes After Connecting Trees I + */ +pub struct Solution {} + +// submission codes start here +use std::collections::VecDeque; + +impl Solution { + pub fn max_target_nodes(edges1: Vec>, edges2: Vec>, k: i32) -> Vec { + // 首先构建邻接矩阵 + let adjacent_matrix1 = Self::construct_adjacent_matrix(&edges1); + let adjacent_matrix2 = Self::construct_adjacent_matrix(&edges2); + + let target_pointer_counts1 = Self::calculate_target_pointer_counts(&adjacent_matrix1, k); + let target_pointer_counts2 = + Self::calculate_target_pointer_counts(&adjacent_matrix2, k - 1); + let max_count = *target_pointer_counts2.iter().max().unwrap(); + + target_pointer_counts1 + .iter() + .map(|&c| c + max_count) + .collect() + } + + fn construct_adjacent_matrix(edges: &Vec>) -> Vec> { + let n = edges.len() + 1; + let mut adjacent_matrix = vec![vec![]; n]; + + for edge in edges.iter() { + let first = edge[0] as usize; + let second = edge[1] as usize; + + adjacent_matrix[first].push(second); + adjacent_matrix[second].push(first); + } + + adjacent_matrix + } + + fn calculate_target_pointer_counts( + adjacent_matrix: &Vec>, + distance: i32, + ) -> Vec { + let mut queue = VecDeque::new(); + + (0..adjacent_matrix.len()) + .map(|i| { + let mut count = 0; + + queue.clear(); + if distance >= 0 { + queue.push_back((i, 0, None)); + } + + while let Some((pos, c, parent)) = queue.pop_front() { + count += 1; + + if c + 1 <= distance { + for &next in adjacent_matrix[pos].iter() { + if parent.filter(|x| x == &next).is_some() { + continue; + } + + queue.push_back((next, c + 1, Some(pos))); + } + } + } + + count + }) + .collect() + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_3372() { + assert_eq!( + vec![1, 1], + Solution::max_target_nodes(vec![vec![0, 1]], vec![vec![0, 1]], 0) + ); + assert_eq!( + vec![9, 7, 9, 8, 8], + Solution::max_target_nodes( + vec![vec![0, 1], vec![0, 2], vec![2, 3], vec![2, 4]], + vec![ + vec![0, 1], + vec![0, 2], + vec![0, 3], + vec![2, 7], + vec![1, 4], + vec![4, 5], + vec![4, 6] + ], + 2 + ) + ); + assert_eq!( + vec![6, 3, 3, 3, 3], + Solution::max_target_nodes( + vec![vec![0, 1], vec![0, 2], vec![0, 3], vec![0, 4]], + vec![vec![0, 1], vec![1, 2], vec![2, 3]], + 1 + ) + ); + } +}