From 7d522dd5cbf205b42fb2b4050d889228124b394c Mon Sep 17 00:00:00 2001 From: Felipe Valencia Date: Wed, 15 May 2024 13:36:05 -0400 Subject: [PATCH] Create 1857-largest-color-value-in-a-directed-graph.rs --- ...largest-color-value-in-a-directed-graph.rs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 rust/1857-largest-color-value-in-a-directed-graph.rs diff --git a/rust/1857-largest-color-value-in-a-directed-graph.rs b/rust/1857-largest-color-value-in-a-directed-graph.rs new file mode 100644 index 000000000..9829a97f6 --- /dev/null +++ b/rust/1857-largest-color-value-in-a-directed-graph.rs @@ -0,0 +1,51 @@ +use std::collections::VecDeque; + +impl Solution { + pub fn largest_path_value(colors: String, edges: Vec>) -> i32 { + let n = colors.len(); + let mut graph = vec![vec![]; n]; + let mut indegree = vec![0; n]; + + for edge in edges { + let u = edge[0] as usize; + let v = edge[1] as usize; + graph[u].push(v); + indegree[v] += 1; + } + + let mut queue = VecDeque::new(); + for i in 0..n { + if indegree[i] == 0 { + queue.push_back(i); + } + } + + let mut color_count = vec![vec![0; 26]; n]; + let mut visited = 0; + let colors = colors.as_bytes(); + let mut max_color_value = 0; + + while let Some(node) = queue.pop_front() { + visited += 1; + let color_index = (colors[node] - b'a') as usize; + color_count[node][color_index] += 1; + max_color_value = max_color_value.max(color_count[node][color_index]); + + for &neigh in &graph[node] { + for i in 0..26 { + color_count[neigh][i] = color_count[neigh][i].max(color_count[node][i]); + } + indegree[neigh] -= 1; + if indegree[neigh] == 0 { + queue.push_back(neigh); + } + } + } + + if visited != n as i32 { + return -1; + } + + max_color_value + } +}