状压、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])