单源最短路

这篇博客探讨了在存在重边的情况下,如何使用深度优先搜索(DFS)策略来找到图中两个节点间的最短路径。文章介绍了两种不同的存储策略,一种是基于字典的方法,需要处理重边并确保不会遗漏路径,另一种是动态规划(DP)二维列表存储,简化了处理重边的过程。两种方法都在DFS过程中进行优化,避免了无效的回溯。博客通过代码示例详细解释了这两种方法,并指出了各自在实现中的注意事项。
摘要由CSDN通过智能技术生成

在这里插入图片描述
这道题本不难,难点是在重边。 正常逻辑应该都可以想到 存储顶点与顶点之间的长度的关系,然后dfs从1到n,相当于回溯~
存储的话 第一种解法是字典,稍许麻烦,因为重边的原因,先排序,然后后续进来一致的都否掉;第二种解法是dp二维列表存储,dp[i] [j]代表的是顶点i到顶点j的距离,下次来就是求min。

然后就是常规的dfs。第一种解法遇到的障碍是忽略了可能不在record里面,相当于在利用字典的时候,还是应该提前判断是否在字典中,否则很难检查,遗留大患!!!!

class Solution:
    def findShortestPath(self , n , m , graph ):
        # write code here
        record = {}
        graph = sorted(graph, key=lambda x:(x[0], x[2]))
        res = 1
                
        for i in range(len(graph)):
            node1, node2, length = graph[i]
            if node1 not in record:
                record[node1] = [[node2, length]]
            else:
                if record[node1][-1][0] == node2:
                    continue
                else:
                    record[node1].append([node2, length])
                    
        self.max_length = 100000000
        sign = {}
        def dfs(node, weight):
            if node == n:
                if weight < self.max_length:
                    self.max_length = weight
                return 
            if node not in record: # 失败源头!!
                return 
            for i in range(len(record[node])):
                res, length = record[node][i]
                if res in sign:
                    continue
                sign[res] = 1
                dfs(res, weight+length)
                sign.pop(res)
                
        dfs(1, 0)
        if self.max_length == 100000000:
            return -1
        return self.max_length
这道题其实和上面的一样,区别是使用了DP来保存i到j的weight。比起字典似乎更加简便。
class Solution:
    def findShortestPath(self , n , m , graph ):
        dp = []
        for i in range(n):
            dp.append([float(1000000)]*n)
        
        for i in range(len(graph)):
            node1, node2, length = graph[i]
            dp[node1-1][node2-1] = min(length, dp[node1-1][node2-1])
        
        sign = {}
        self.max_length = 1000000
        def dfs(node, weight):
            if node == n-1:
                if weight < self.max_length:
                    self.max_length = weight
                return 
            for i in range(n):
                if i in sign:
                    continue
                if dp[node][i] != 1000000:
                    sign[i] = 1
                    dfs(i, weight+dp[node][i])
                    sign.pop(i)
                else:
                    continue
        dfs(0, 0)
        if self.max_length == 1000000:
            return -1
        return self.max_length
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值