前言
在图中,寻找起点到目标点的步数/是否存在路径相关,bfs相对dfs更快,毕竟空间换时间了,双向bfs会更快一点,毕竟一层一层的扩展起来非常大,队列要存太多元素。
一、节点间的通路
二、go使用队列记录
1.go的队列库:container/list,list.New()获取队列,双向链表,可PushBack,也可PushFront,出队Front
2.队列中的元素是指针类型*Elem,想要得到其值x.Value,进一步断定类型,可.(ElemType)
func findWhetherExistsPath(n int, graph [][]int, start int, target int) bool {
// 起点即终点
if start == target {
return true
}
// 把图用邻接表存起来。
g := getNeiSheet(n,graph)
// bfs寻找源点到目标点是否有路径。
return bfs(start,target,g)
}
func bfs(s,t int,g []map[int]interface{}) bool {
// 防止重复访问
p := map[int]interface{}{}
// 开辟队列
que := list.New()
que.PushBack(s)
// 采用队列来进行“层次遍历”
for x := que.Front();x != nil;x = x.Next() {
// 找到了
if v := x.Value.(int);v == t {
return true
}
// 没有边
v := x.Value.(int)
if g[v] == nil {
continue
}
// 下一波入队,不许重复。
for k := range g[v] {
if _,ok := p[k];!ok {
que.PushBack(k)
p[k] = struct{}{}
}
}
}
return false
}
func getNeiSheet(n int,edges [][]int) []map[int]interface{} {
g := make([]map[int]interface{},n)
for _,edge := range edges {
a,b := edge[0],edge[1]
if g[a] == nil {
g[a] = map[int]interface{}{}
}
g[a][b] = struct{}{}
}
return g
}
// 找一个节点到另一个节点是否有路径,最快就是bfs
总结
1)在图中,寻找起点到目标点的步数/是否存在路径相关,bfs相对dfs更快,毕竟空间换时间了,双向bfs会更快一点,毕竟一层一层的扩展起来非常大,队列要存太多元素。
参考资料
[1] LeetCode 节点间通路