Update go version
This commit is contained in:
39
vendor/honnef.co/go/tools/internal/xtools-internal/graph/scc.go
vendored
Normal file
39
vendor/honnef.co/go/tools/internal/xtools-internal/graph/scc.go
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright 2026 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package graph
|
||||
|
||||
import "slices"
|
||||
|
||||
// SCCs computes the strongly connected components of the graph g.
|
||||
func SCCs[NodeID comparable](g Graph[NodeID]) [][]NodeID {
|
||||
// Use Kosaraju's algorithm. Tarjan is overkill here.
|
||||
|
||||
// Forward pass
|
||||
S := Postorder(g)
|
||||
|
||||
// Reverse pass
|
||||
gt := Transpose(g)
|
||||
seen := make(map[NodeID]bool)
|
||||
var scc []NodeID
|
||||
var sccs [][]NodeID
|
||||
var rvisit func(NodeID)
|
||||
rvisit = func(u NodeID) {
|
||||
if !seen[u] {
|
||||
seen[u] = true
|
||||
scc = append(scc, u)
|
||||
for v := range gt.Out(u) {
|
||||
rvisit(v)
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, root := range slices.Backward(S) {
|
||||
if !seen[root] {
|
||||
scc = nil
|
||||
rvisit(root)
|
||||
sccs = append(sccs, scc)
|
||||
}
|
||||
}
|
||||
return sccs
|
||||
}
|
||||
Reference in New Issue
Block a user