use crate::graph::{bfs::bfs, def::Graph, dfs::dfs};
use cargo_snippet::snippet;
#[snippet("bfs")]
pub fn dist_table<'a, G>(g: &'a G, start: G::NodeId) -> Vec<usize>
where
G: Graph<'a, NodeId = usize>,
{
let mut dist = vec![std::usize::MAX; g.len()];
dist[start] = 0;
for (f, t) in bfs(g, start) {
dist[t] = dist[f] + 1;
}
dist
}
#[snippet("bfs")]
pub fn shortest_path<'a, G: Graph<'a, NodeId = usize>>(
g: &'a G,
start: usize,
goal: usize,
) -> usize {
let mut dist = vec![std::usize::MAX; g.len()];
dist[start] = 0;
for (f, t) in bfs(g, start) {
if t == goal {
return dist[f] + 1;
}
dist[t] = dist[f] + 1;
}
std::usize::MAX
}
pub fn classify_into_connected_group<'a, G: Graph<'a, NodeId = usize>>(
g: &'a G,
) -> Vec<Vec<usize>> {
let mut classified = vec![None; g.len()];
let mut cur = 0usize;
for u in 0..g.len() {
match classified[u] {
Some(_) => {}
None => {
classified[u] = Some(cur);
for (_, t) in dfs(g, u) {
classified[t] = Some(cur);
}
cur += 1;
}
}
}
let mut res = vec![Vec::new(); cur];
for (i, c) in classified.into_iter().map(|x| x.unwrap()).enumerate() {
res[c].push(i);
}
res
}