20250526 finished.
This commit is contained in:
parent
1a9ecb53eb
commit
1cafc5eca5
|
@ -676,3 +676,5 @@ mod p3068_find_the_maximum_sum_of_node_values;
|
|||
mod p2942_find_words_containing_character;
|
||||
|
||||
mod p2131_longest_palindrome_by_concatenating_two_letter_words;
|
||||
|
||||
mod p1857_largest_color_value_in_a_directed_graph;
|
||||
|
|
98
src/problem/p1857_largest_color_value_in_a_directed_graph.rs
Normal file
98
src/problem/p1857_largest_color_value_in_a_directed_graph.rs
Normal file
|
@ -0,0 +1,98 @@
|
|||
/**
|
||||
* [1857] Largest Color Value in a Directed Graph
|
||||
*/
|
||||
pub struct Solution {}
|
||||
|
||||
// submission codes start here
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::iter::FromIterator;
|
||||
|
||||
impl Solution {
|
||||
pub fn largest_path_value(colors: String, edges: Vec<Vec<i32>>) -> i32 {
|
||||
let colors: Vec<usize> = colors.bytes().map(|x| (x - b'a') as usize).collect();
|
||||
let mut adjacency_matrix = vec![vec![]; colors.len()];
|
||||
// 入度节点
|
||||
let mut in_degrees = vec![0; colors.len()];
|
||||
|
||||
for edge in edges.iter() {
|
||||
let start = edge[0] as usize;
|
||||
let end = edge[1] as usize;
|
||||
|
||||
adjacency_matrix[start].push(end);
|
||||
in_degrees[end] += 1;
|
||||
}
|
||||
|
||||
// 使用拓扑排序判断是否有环
|
||||
// 同时获得一个拓扑序列表
|
||||
let mut queue = VecDeque::from_iter(in_degrees.iter().enumerate().filter_map(|(i, v)| {
|
||||
if *v == 0 {
|
||||
Some(i)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}));
|
||||
let mut topology_list = vec![];
|
||||
|
||||
while let Some(head) = queue.pop_front() {
|
||||
topology_list.push(head);
|
||||
for &next in adjacency_matrix[head].iter() {
|
||||
in_degrees[next] -= 1;
|
||||
|
||||
if in_degrees[next] == 0 {
|
||||
queue.push_back(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if in_degrees.iter().any(|x| *x != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// dp[i][c]表示从节点i开始路径上颜色为c的计数
|
||||
// 颜色只能是小写字母
|
||||
let mut dp = vec![vec![0; 26]; topology_list.len()];
|
||||
let mut result = HashMap::new();
|
||||
|
||||
for &node in topology_list.iter().rev() {
|
||||
let c = colors[node];
|
||||
|
||||
for &next in adjacency_matrix[node].iter() {
|
||||
for i in 0..26 {
|
||||
dp[node][i] = dp[node][i].max(dp[next][i]);
|
||||
}
|
||||
|
||||
dp[node][c] = dp[node][c].max(dp[next][c] + 1);
|
||||
let entry = result.entry(c).or_insert(0);
|
||||
*entry = dp[node][c].max(*entry);
|
||||
}
|
||||
|
||||
if adjacency_matrix[node].is_empty() {
|
||||
dp[node][c] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
result.values().max().map_or_else(|| 1, |x| *x)
|
||||
}
|
||||
}
|
||||
|
||||
// submission codes end
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_1857() {
|
||||
assert_eq!(
|
||||
3,
|
||||
Solution::largest_path_value(
|
||||
"abaca".to_string(),
|
||||
vec![vec![0, 1], vec![0, 2], vec![2, 3], vec![3, 4]]
|
||||
)
|
||||
);
|
||||
assert_eq!(
|
||||
-1,
|
||||
Solution::largest_path_value("a".to_string(), vec![vec![0, 0]])
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user