You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
915 B
58 lines
915 B
package grok |
|
|
|
type graph map[string][]string |
|
|
|
func reverseList(s []string) (r []string) { |
|
for _, i := range s { |
|
i := i |
|
defer func() { r = append(r, i) }() |
|
} |
|
return |
|
} |
|
|
|
func sortGraph(g graph) (order, cyclic []string) { |
|
L := make([]string, len(g)) |
|
i := len(L) |
|
temp := map[string]bool{} |
|
perm := map[string]bool{} |
|
var cycleFound bool |
|
var cycleStart string |
|
var visit func(string) |
|
visit = func(n string) { |
|
switch { |
|
case temp[n]: |
|
cycleFound = true |
|
cycleStart = n |
|
return |
|
case perm[n]: |
|
return |
|
} |
|
temp[n] = true |
|
for _, m := range g[n] { |
|
visit(m) |
|
if cycleFound { |
|
if cycleStart > "" { |
|
cyclic = append(cyclic, n) |
|
if n == cycleStart { |
|
cycleStart = "" |
|
} |
|
} |
|
return |
|
} |
|
} |
|
delete(temp, n) |
|
perm[n] = true |
|
i-- |
|
L[i] = n |
|
} |
|
for n := range g { |
|
if perm[n] { |
|
continue |
|
} |
|
visit(n) |
|
if cycleFound { |
|
return nil, cyclic |
|
} |
|
} |
|
return L, nil |
|
}
|
|
|