1. 解题思路
这一题也有点惭愧,因为没能自力做出来,不过思路上其实是想到了的,可惜细节处理上不到位,以至于最终没能把这道题搞出来。
我最开始的思路是这样的:
- 求出每个根节点开始遍历所有的位置所需要改变的边的数目;
- 对于剩余其他的点,只需要看将它到关于它的任何一个根节点的深度加上对应的根节点遍历所需的边的数目之和就是对应的答案。
因此,事实上问题就变成了如何求所有根节点遍历所需改变的边的数目,但是的想法也是利用2的思路进一步拆分问题,不过这里并不好处理,中间有些细节的组合问题一直处理不好,最终也没有做出来。
而看了大佬的思路,整体的思路还是差不多,但是思路上更加直接,因此处理起来也更加方便:
- 考察任意节点(比如说0)作为根节点时,遍历完所有节点所需要改变的边的数目;
- 对任意其他的点作为初始点,完成遍历所需的个数事实上就是其到1中节点的路径中改变的边的个数的互补数加上剩余其他边的数目。
此时,我们分别用两个深度优先遍历即可完成上述问题。
2. 代码实现
给出python代码实现如下:
class Solution:
def minEdgeReversals(self, n: int, edges: List[List[int]]) -> List[int]:
res = [0 for _ in range(n)]
graph = defaultdict(list)
for u, v in edges:
graph[u].append((v, 1))
graph[v].append((u, 0))
def dfs1(u, father):
res = 0
for v, direction in graph[u]:
if v == father:
continue
if direction == 0:
res += 1
res += dfs1(v, u)
return res
res[0] = dfs1(0, -1)
def dfs2(u, father):
nonlocal res
for v, direction in graph[u]:
if v == father:
continue
if direction == 1:
res[v] = res[u] + 1
else:
res[v] = res[u] - 1
dfs2(v, u)
return
dfs2(0, -1)
return res
提交代码评测得到:耗时1851ms,占用内存185.3MB。