Leetcode 2858. Minimum Edge Reversals So Every Node Is Reachable

文章讲述了在LeetCode问题2858中,如何使用深度优先遍历的策略来计算最少的边反转次数,使得每个节点都能到达。作者分享了最初的思路和观察,以及大佬的解决方案和Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这一题也有点惭愧,因为没能自力做出来,不过思路上其实是想到了的,可惜细节处理上不到位,以至于最终没能把这道题搞出来。

我最开始的思路是这样的:

  1. 求出每个根节点开始遍历所有的位置所需要改变的边的数目;
  2. 对于剩余其他的点,只需要看将它到关于它的任何一个根节点的深度加上对应的根节点遍历所需的边的数目之和就是对应的答案。

因此,事实上问题就变成了如何求所有根节点遍历所需改变的边的数目,但是的想法也是利用2的思路进一步拆分问题,不过这里并不好处理,中间有些细节的组合问题一直处理不好,最终也没有做出来。

而看了大佬的思路,整体的思路还是差不多,但是思路上更加直接,因此处理起来也更加方便:

  1. 考察任意节点(比如说0)作为根节点时,遍历完所有节点所需要改变的边的数目;
  2. 对任意其他的点作为初始点,完成遍历所需的个数事实上就是其到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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值