leetcode:847. 访问所有节点的最短路径【bfs + 记忆化seen】

博客围绕解决问题的算法展开。因n小采用状态压缩二进制,访问全部元素需mask全1,求最短路径用广度优先搜索(BFS),并用seen记录(now, mask)避免重复。遍历各点可作起点,记忆化(now, mask),mask首次全1时记录最短路径。

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

在这里插入图片描述
在这里插入图片描述

分析

n这么小,天生的状态压缩二进制
然后要访问完全部所以mask要全1
最短路径的话要用bfs
然后用seen记录(now, mask)
再次遇到的话肯定不是最短的

ac code

class Solution:
    def shortestPathLength(self, graph: List[List[int]]) -> int:
        n = len(graph)


        # (now, mask)作为记忆化标签, cnt表示当前步数
        dq = deque([(i, 1 << i, 0) for i in range(n)])
        seen = set([(i, 1 << i) for i in range(n)])

        # bfs(最少的步数走完全部)
        while dq:
            now, mask, cnt = dq.popleft()
            if mask == (1 << n) - 1:
                return cnt
            for next in graph[now]:
                # 没有重复(now, mask)
                if (next, mask | (1 << next)) not in seen:
                    seen.add((next, mask | (1 << next)))
                    dq.append((next, mask | (1 << next), cnt + 1))

总结

开始遍历的时候都可以为起点
记忆化(now, mask)
当mask第一次满了之后,就是最短的路径(注意,要记录一下当前的最短路径)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白速龙王的回眸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值