20250529 finished.

This commit is contained in:
jackfiled 2025-05-29 14:01:23 +08:00
parent 909d89a297
commit f91eaffcb3
2 changed files with 109 additions and 0 deletions

View File

@ -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;

View File

@ -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<Vec<i32>>, edges2: Vec<Vec<i32>>) -> Vec<i32> {
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<i32>>) -> Vec<Vec<usize>> {
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<Vec<usize>>) -> (i32, i32, Vec<bool>) {
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]]
)
);
}
}