力扣 847. 访问所有节点的最短路径 python AC

状压、bfs

class Solution:
    def shortestPathLength(self, graph):
        n = len(graph)
        end = (1 << n) - 1
        ans = float('inf')
        q = [((1 << start), start, 0) for start in range(n)]
        dis = [[float('inf')] * n for _ in range(1 << n)]
        for i in range(n):
            dis[(1 << i)][i] = 0
        while q:
            now, pre, step = q.pop(0)
            if now == end:
                ans = min(ans, step)
            for i in graph[pre]:
                if dis[now | (1 << i)][i] > step + 1:
                    dis[now | (1 << i)][i] = step + 1
                    q.append((now | (1 << i), i, step + 1))
        return ans

状压、动态规划

class Solution:
    def shortestPathLength(self, graph):
        n = len(graph)
        end = (1 << n) - 1
        inf = float('inf')
        floyd = [[inf] * n for _ in range(n)]
        for i in range(n):
            for j in graph[i]:
                floyd[i][j] = 1
        for k in range(n):
            for i in range(n):
                for j in range(n):
                    floyd[i][j] = min(floyd[i][j], floyd[i][k] + floyd[k][j])
        dp = [[inf] * n for _ in range(1 << n)]
        for i in range(n):
            dp[1 << i][i] = 0
        for i in range(1 << n):
            for pre in range(n):
                for nex in range(n):
                    if i & (1 << pre) and not i & (1 << nex):
                        dp[i ^ (1 << nex)][nex] = min(dp[i ^ (1 << nex)][nex], dp[i][pre] + floyd[pre][nex])
        return min(dp[end])

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值