编辑代码

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
}