package main
import "fmt"
var preregs = map[string][]string{
"algorithms":{"data structures"},
"calculus":{"linear algebra"},
"compilers":{ "data structures",
"formal languages",
"computer organization",
},
"data structures":{ "discrete math"},
}
func main(){
for i ,coures := range topoSort(preregs){
fmt.Printf("%d:\t%s\n",i+1 , coures)
}
}
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
}