解题思路
执行用时:140 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:16.8 MB, 在所有 Go 提交中击败了82.00%的用户
将连接图转化成有向图,用二维slice存放。
此处将连接的起点设置为from
也就是graph的外层下标,将连接的目标设为target
也就是graph的内层元素。
graph会将每一个连接存放两次,使得从任一起点都可以遍历完毕该树
,target会保存正负以代表该连接方向。
另外新建visited判断是否遍历过节点,从0开始遍历,遍历中遇到连接方向错误的进行计数。
代码
func minReorder(n int, connections [][]int) int {
graph := make([][]int, n)
for _, conn := range connections {
i, j := conn[0], conn[1]
graph[i] = append(graph[i], j)
graph[j] = append(graph[j], -i)
}
visited := make([]bool, n)
count := 0
var dfs func(from int)
dfs = func(from int) {
visited[from] = true
for _, target := range graph[from] {
if target < 0 && !visited[-target] {
dfs(-target)
} else if target > 0 && !visited[target] {
dfs(target)
count++
}
}
}
dfs(0)
return count
}