use std::collections::{VecDeque, HashSet};
fn bfs(start: usize, graph: &Vec<Vec<usize>>, visited: &mut HashSet<usize>) {
let mut queue = VecDeque::new();
queue.push_back(start);
visited.insert(start);
while let Some(node) = queue.pop_front() {
for &neighbor in &graph[node] {
if !visited.contains(&neighbor) {
visited.insert(neighbor);
queue.push_back(neighbor);
}
}
}
}
fn connected_components(graph: &Vec<Vec<usize>>) -> usize {
let mut visited = HashSet::new();
let mut count = 0;
for node in 0..graph.len() {
if !visited.contains(&node) {
bfs(node, graph, &mut visited);
count += 1;
}
}
count
}
fn main() {
let graph = vec![
vec![1], // 0 connected to 1
vec![0, 2], // 1 connected to 0 and 2
vec![1], // 2 connected to 1
vec![4], // 3 connected to 4
vec![3], // 4 connected to 3
vec![] // 5 isolated
];
println!("{}", connected_components(&graph));
}The graph has three connected groups: nodes 0-1-2, nodes 3-4, and node 5 alone. So the output is 3.
BFS visits all nodes reachable from a starting node before moving to another component, effectively grouping connected nodes.
use std::collections::{VecDeque, HashSet};
fn bfs(start: usize, graph: &Vec<Vec<usize>>, visited: &mut HashSet<usize>) {
let mut queue = VecDeque::new();
queue.push_back(start);
while let Some(node) = queue.pop_front() {
for &neighbor in &graph[node] {
if !visited.contains(&neighbor) {
visited.insert(neighbor);
queue.push_back(neighbor);
}
}
}
}
fn connected_components(graph: &Vec<Vec<usize>>) -> usize {
let mut visited = HashSet::new();
let mut count = 0;
for node in 0..graph.len() {
if !visited.contains(&node) {
bfs(node, graph, &mut visited);
count += 1;
}
}
count
}
fn main() {
let graph = vec![
vec![1],
vec![0, 2],
vec![1],
vec![4],
vec![3],
vec![]
];
println!("{}", connected_components(&graph));
}The BFS function does not mark the start node as visited before processing neighbors, so it may revisit the start node causing infinite loops or logic errors.
use std::collections::{VecDeque, HashSet};
fn bfs_order(start: usize, graph: &Vec<Vec<usize>>) -> Vec<usize> {
let mut visited = HashSet::new();
let mut queue = VecDeque::new();
let mut order = Vec::new();
queue.push_back(start);
visited.insert(start);
while let Some(node) = queue.pop_front() {
order.push(node);
for &neighbor in &graph[node] {
if !visited.contains(&neighbor) {
visited.insert(neighbor);
queue.push_back(neighbor);
}
}
}
order
}
fn main() {
let graph = vec![
vec![1, 2], // 0 connected to 1, 2
vec![0, 3], // 1 connected to 0, 3
vec![0, 4], // 2 connected to 0, 4
vec![1], // 3 connected to 1
vec![2] // 4 connected to 2
];
let result = bfs_order(0, &graph);
println!("{:?}", result);
}Starting at 0, BFS visits neighbors 1 and 2 in order, then visits neighbors of 1 (3), then neighbors of 2 (4).
Initially, components are {0,1,2}, {3,4}, and {5}. Adding edge [2,3] connects first two groups into one {0,1,2,3,4}. Adding [4,5] connects node 5 to this group. So all nodes are connected in one component.
But careful: The question asks after adding edges [[2,3],[4,5]] together, so the final count is 1.
