拓扑排序是将有向无环图(DAG)的所有顶点排成线性序列,使得边 (u,v) 中 u 出现在 v 之前。
func topoSort(m map[string][]string) []string {
var order []string
seen := make(map[string]bool)
var visitAll func(items []string)
visitAll = func(items []string) {
for _, item := range items {
if !seen[item] {
seen[item] = true
visitAll(m[item])
order = append(order, item)
}
}
}
var keys []string
for key := range m {
keys = append(keys, key)
}
sort.Strings(keys)
visitAll(keys)
return order
}
深度优先搜索:沿着树的深度遍历节点,尽可能深地搜索分支。当所有边都已探寻,搜索回溯到起始节点。