58 lines
926 B
Go
58 lines
926 B
Go
|
package main
|
||
|
|
||
|
const (
|
||
|
DIRECT = 1
|
||
|
REVERSE = 0
|
||
|
)
|
||
|
|
||
|
type Edge struct {
|
||
|
neighbor int
|
||
|
edgeType int
|
||
|
}
|
||
|
|
||
|
func minReorder(n int, connections [][]int) int {
|
||
|
var dfs func(int, int)
|
||
|
makeGraph := func() map[int]([]Edge) {
|
||
|
g := make(map[int]([]Edge))
|
||
|
|
||
|
for _, edge := range connections {
|
||
|
u, v := edge[0], edge[1]
|
||
|
|
||
|
neighbors, present := g[u]
|
||
|
if !present {
|
||
|
neighbors = make([]Edge, 0)
|
||
|
}
|
||
|
g[u] = append(neighbors, Edge{neighbor: v, edgeType: DIRECT})
|
||
|
|
||
|
neighbors, present = g[v]
|
||
|
if !present {
|
||
|
neighbors = make([]Edge, 0)
|
||
|
}
|
||
|
g[v] = append(neighbors, Edge{neighbor: u, edgeType: REVERSE})
|
||
|
}
|
||
|
|
||
|
return g
|
||
|
}
|
||
|
|
||
|
graph := makeGraph()
|
||
|
|
||
|
count := 0
|
||
|
dfs = func(parent, node int) {
|
||
|
neighbors, found := graph[node]
|
||
|
if !found {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for _, edge := range neighbors {
|
||
|
if edge.neighbor != parent {
|
||
|
count += edge.edgeType
|
||
|
dfs(node, edge.neighbor)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dfs(-1, 0)
|
||
|
|
||
|
return count
|
||
|
}
|