From 35252ff989d553078f5a3dc37f6ddb7deb9df1b0 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sun, 4 Jun 2023 13:22:20 +0200 Subject: [PATCH] =?UTF-8?q?problems(rs):=20add=20=E2=80=9C547.=20Number=20?= =?UTF-8?q?of=20Provinces=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- problems/rs/number-of-provinces.rs | 64 ++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 problems/rs/number-of-provinces.rs diff --git a/problems/rs/number-of-provinces.rs b/problems/rs/number-of-provinces.rs new file mode 100644 index 0000000..234e28f --- /dev/null +++ b/problems/rs/number-of-provinces.rs @@ -0,0 +1,64 @@ +use std::collections::VecDeque; + +struct Solution {} +impl Solution { + fn bfs(graph: &[Vec], visited: &mut [bool], u0: usize) { + let mut q = VecDeque::new(); + q.push_back(u0); + visited[u0] = true; + + while let Some(u) = q.pop_front() { + for v in (0..graph.len()).filter(|&v| graph[u][v] != 0) { + if visited[v] { + continue; + } + + q.push_back(v); + visited[v] = true; + } + } + } + + pub fn find_circle_num(is_connected: Vec>) -> i32 { + let mut visited = vec![false; is_connected.len()]; + + let mut count = 0; + for i in 0..is_connected.len() { + if visited[i] { + continue; + } + + Solution::bfs(&is_connected, &mut visited, i); + count += 1; + } + + count + } +} + +fn main() {} + +#[cfg(test)] +mod tests { + use super::*; + + // Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]] + // Output: 2 + #[test] + fn example_1() { + assert_eq!( + Solution::find_circle_num(vec![vec![1, 1, 0], vec![1, 1, 0], vec![0, 0, 1]]), + 2 + ); + } + + // Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]] + // Output: 3 + #[test] + fn example_2() { + assert_eq!( + Solution::find_circle_num(vec![vec![1, 0, 0], vec![0, 1, 0], vec![0, 0, 1]]), + 3 + ); + } +}