20250528 finished.
This commit is contained in:
parent
26bb74425e
commit
909d89a297
|
@ -680,3 +680,5 @@ mod p2131_longest_palindrome_by_concatenating_two_letter_words;
|
||||||
mod p1857_largest_color_value_in_a_directed_graph;
|
mod p1857_largest_color_value_in_a_directed_graph;
|
||||||
|
|
||||||
mod p2894_divisible_and_non_divisible_sums_difference;
|
mod p2894_divisible_and_non_divisible_sums_difference;
|
||||||
|
|
||||||
|
mod p3372_maximize_the_number_of_target_nodes_after_connecting_trees_i;
|
||||||
|
|
|
@ -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<Vec<i32>>, edges2: Vec<Vec<i32>>, k: i32) -> Vec<i32> {
|
||||||
|
// 首先构建邻接矩阵
|
||||||
|
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<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>>,
|
||||||
|
distance: i32,
|
||||||
|
) -> Vec<i32> {
|
||||||
|
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
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user