20250529 finished.
This commit is contained in:
parent
909d89a297
commit
f91eaffcb3
|
@ -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;
|
||||
|
|
|
@ -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]]
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user