用DFS+memo和BFS分别解答 leetcode 847题:Shortest Path Visiting All Nodes

今天做leetcode的一道新题847题,顺便复习了下DFS和BFS这两种图论遍历方法,用其进行解题,加深了理解。

这道题是非常经典的遍历题,直接用DFS会超时,并且无法通过所有的案例,用DFS+memo可以解决,BFS的效率更高,因为这道题本身就是求最短路径类的题目。

先来看题目描述:

二维数组给出了连通的无向图中每个节点的邻接节点列表,因此二维数组的行数是图中节点的个数。图中节点从0到n-1进行编号。求出遍历所有节点的最小路径,节点可以重复访问,边也可以重复走。


因为图的节点个数不超过12个,因此,我们完全可以用一个整数的比特位来表示该节点当前有没有被访问,这个整数就是访问的status,用二维数组,第一维就是status,第二维就是当前访问的节点编号。(status, i)表示当前访问节点i,访问状态为status的即时状态。以样例中第一个为例,输入[[1,2,3],[0],[0],[0]]。我们在这画出状态转移的树形图,方便我们解题。下面我们可以看到,我们既可以用这个树形图来写出dfs+memo的代码,也可以用它来写出bfs的代码。取决于我们对于题目的分析和对下面这张图的解读。


方法一:DFS+memo:一个bool数组visited用来剪枝,DFS路径上遇到之前已经访问过的状态的时候,就不继续进行DFS遍历了,终止(END),另一个数组mp为记忆数组,mp[(status,i)]表示(status,i)距离目标状态的最小距离,避免重复计算。在DFS的上层函数中,依次从图的各个节点开始进行DFS,求出从每个节点开始进行遍历而得到的最小遍历距离,再从这些距离中找到全局最小距离即可。

代码如下:

clas
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值