From f91eaffcb3872007f84cffbe82d2767de0d9bcef Mon Sep 17 00:00:00 2001 From: jackfiled Date: Thu, 29 May 2025 14:01:23 +0800 Subject: [PATCH] 20250529 finished. --- src/problem/mod.rs | 2 + ..._target_nodes_after_connecting_trees_ii.rs | 107 ++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/problem/p3373_maximize_the_number_of_target_nodes_after_connecting_trees_ii.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 2c54675..53fd04c 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -682,3 +682,5 @@ 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; + +mod p3373_maximize_the_number_of_target_nodes_after_connecting_trees_ii; diff --git a/src/problem/p3373_maximize_the_number_of_target_nodes_after_connecting_trees_ii.rs b/src/problem/p3373_maximize_the_number_of_target_nodes_after_connecting_trees_ii.rs new file mode 100644 index 0000000..3a41f51 --- /dev/null +++ b/src/problem/p3373_maximize_the_number_of_target_nodes_after_connecting_trees_ii.rs @@ -0,0 +1,107 @@ +/** + * [3373] Maximize the Number of Target Nodes After Connecting Trees II + */ +pub struct Solution {} + +// submission codes start here +use std::collections::VecDeque; + +impl Solution { + pub fn max_target_nodes(edges1: Vec>, edges2: Vec>) -> Vec { + let adjacent_matrix1 = Self::construct_adjacent_matrix(&edges1); + let adjacent_matrix2 = Self::construct_adjacent_matrix(&edges2); + + let (even_count1, odd_count1, color1) = + Self::calculate_target_pointer_counts(&adjacent_matrix1); + let (even_count2, odd_count2, _) = Self::calculate_target_pointer_counts(&adjacent_matrix2); + + let max_count = odd_count2.max(even_count2); + + (0..adjacent_matrix1.len()) + .map(|i| { + if color1[i] { + even_count1 + max_count + } else { + odd_count1 + 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>) -> (i32, i32, Vec) { + let mut queue = VecDeque::new(); + // 染色数组 + // true表示距离为偶数 + // false表示距离为奇数 + let mut color = vec![false; adjacent_matrix.len()]; + // 距离为偶数的计数 + let mut result = 0; + + queue.push_back((0, 0, None)); + + while let Some((pos, c, parent)) = queue.pop_front() { + if c % 2 == 0 { + color[pos] = true; + result += 1; + } + + for &next in adjacent_matrix[pos].iter() { + if parent.filter(|x| x == &next).is_some() { + continue; + } + + queue.push_back((next, c + 1, Some(pos))); + } + } + + (result, adjacent_matrix.len() as i32 - result, color) + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_3373() { + assert_eq!( + vec![8, 7, 7, 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] + ] + ) + ); + assert_eq!( + vec![3, 6, 6, 6, 6], + 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]] + ) + ); + } +}