847. 访问所有节点的最短路径

2021/09/20 leetcode 共 819 字,约 3 分钟

title

problem link

存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。

给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。

返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重用边。

示例 1:

img

输入:graph = [[1,2,3],[0],[0],[0]]
输出:4
解释:一种可能的路径为 [1,0,2,0,3]

示例 2:

img

输入:graph = [[1],[0,2,4],[1,3,4],[2],[1,2]]
输出:4
解释:一种可能的路径为 [0,1,4,2,3]

提示:

  • n == graph.length
  • 1 <= n <= 12
  • 0 <= graph[i].length < n
  • graph[i] 不包含 i
  • 如果 graph[a] 包含 b ,那么 graph[b] 也包含 a
  • 输入的图总是连通图

solution

bds, mask

class Solution:
    def shortestPathLength(self, graph: List[List[int]]) -> int:
        n = len(graph)
        seen = set()
        import collections
        q = collections.deque()
        for i in range(n):
            v = (i, 1 << i, 0)
            q.append(v)
            seen.add(v)
        while q:
            v, mask, dist = q.popleft()
            if mask == (1 << n) - 1:
                return dist
            for next in graph[v]:
                cur = (next, mask | (1 << next))
                if cur not in seen:
                    q.append((next, mask | (1 << next), dist + 1))
                    seen.add(cur)
        return -1

也可以先qi求出所有最短路径,然后状态压缩动态规划枚举mask,节点u.

Search

    Table of Contents