分析
n这么小,天生的状态压缩二进制
然后要访问完全部所以mask要全1
最短路径的话要用bfs
然后用seen记录(now, mask)
再次遇到的话肯定不是最短的
ac code
class Solution:
def shortestPathLength(self, graph: List[List[int]]) -> int:
n = len(graph)
# (now, mask)作为记忆化标签, cnt表示当前步数
dq = deque([(i, 1 << i, 0) for i in range(n)])
seen = set([(i, 1 << i) for i in range(n)])
# bfs(最少的步数走完全部)
while dq:
now, mask, cnt = dq.popleft()
if mask == (1 << n) - 1:
return cnt
for next in graph[now]:
# 没有重复(now, mask)
if (next, mask | (1 << next)) not in seen:
seen.add((next, mask | (1 << next)))
dq.append((next, mask | (1 << next), cnt + 1))
总结
开始遍历的时候都可以为起点
记忆化(now, mask)
当mask第一次满了之后,就是最短的路径(注意,要记录一下当前的最短路径)