2021-05-05 20:52:28 +02:00
|
|
|
// Breadth-First Search (BFS) allows you to find the shortest distance between two nodes in the graph.
|
|
|
|
fn breadth_first_search_path(graph map[string][]string, vertex string, target string) []string {
|
|
|
|
mut path := []string{}
|
|
|
|
mut visited := []string{init: vertex}
|
|
|
|
mut queue := [][][]string{}
|
|
|
|
queue << [[vertex], path]
|
|
|
|
for queue.len > 0 {
|
|
|
|
mut idx := queue.len - 1
|
|
|
|
node := queue[idx][0][0]
|
|
|
|
path = queue[idx][1]
|
|
|
|
queue.delete(idx)
|
|
|
|
if node == target {
|
|
|
|
path << node
|
|
|
|
return path
|
|
|
|
}
|
|
|
|
for child in graph[node] {
|
|
|
|
mut tmp := path.clone()
|
|
|
|
if child !in visited {
|
|
|
|
visited << child
|
|
|
|
tmp << node
|
|
|
|
queue << [[child], tmp]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return path
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2021-08-04 11:44:41 +02:00
|
|
|
graph := {
|
2021-05-05 20:52:28 +02:00
|
|
|
'A': ['B', 'C']
|
|
|
|
'B': ['A', 'D', 'E']
|
|
|
|
'C': ['A', 'F']
|
|
|
|
'D': ['B']
|
|
|
|
'E': ['B', 'F']
|
|
|
|
'F': ['C', 'E']
|
|
|
|
}
|
|
|
|
println('Graph: $graph')
|
|
|
|
path := breadth_first_search_path(graph, 'A', 'F')
|
|
|
|
println('The shortest path from node A to node F is: $path')
|
|
|
|
assert path == ['A', 'C', 'F']
|
|
|
|
}
|