class Solution {
public:
int shortestPathLength(vector<vector<int>>& graph) {
}
};
847. 访问所有节点的最短路径
存在一个由 n
个节点组成的无向连通图,图中的节点按从 0
到 n - 1
编号。
给你一个数组 graph
表示这个图。其中,graph[i]
是一个列表,由所有与节点 i
直接相连的节点组成。
返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重用边。
示例 1:
输入:graph = [[1,2,3],[0],[0],[0]] 输出:4 解释:一种可能的路径为 [1,0,2,0,3]
示例 2:
输入: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
原站题解
python3 解法, 执行用时: 176 ms, 内存消耗: 19.9 MB, 提交时间: 2022-08-01 10:51:13
class Solution: def shortestPathLength(self, graph: List[List[int]]) -> int: n = len(graph) q = deque((i, 1 << i, 0) for i in range(n)) seen = {(i, 1 << i) for i in range(n)} ans = 0 while q: u, mask, dist = q.popleft() if mask == (1 << n) - 1: ans = dist break # 搜索相邻的节点 for v in graph[u]: # 将 mask 的第 v 位置为 1 mask_v = mask | (1 << v) if (v, mask_v) not in seen: q.append((v, mask_v, dist + 1)) seen.add((v, mask_v)) return ans
python3 解法, 执行用时: 940 ms, 内存消耗: 15.4 MB, 提交时间: 2022-08-01 10:50:58
class Solution: def shortestPathLength(self, graph: List[List[int]]) -> int: n = len(graph) d = [[n + 1] * n for _ in range(n)] for i in range(n): for j in graph[i]: d[i][j] = 1 # 使用 floyd 算法预处理出所有点对之间的最短路径长度 for k in range(n): for i in range(n): for j in range(n): d[i][j] = min(d[i][j], d[i][k] + d[k][j]) f = [[float("inf")] * (1 << n) for _ in range(n)] for mask in range(1, 1 << n): # 如果 mask 只包含一个 1,即 mask 是 2 的幂 if (mask & (mask - 1)) == 0: u = bin(mask).count("0") - 1 f[u][mask] = 0 else: for u in range(n): if mask & (1 << u): for v in range(n): if (mask & (1 << v)) and u != v: f[u][mask] = min(f[u][mask], f[v][mask ^ (1 << u)] + d[v][u]) ans = min(f[u][(1 << n) - 1] for u in range(n)) return ans