Description
You have an undirected, connected graph of n
nodes labeled from 0
to n - 1
. You are given an array graph
where graph[i]
is a list of all the nodes connected with node i
by an edge.
Return the length of the shortest path that visits every node. You may start and stop at any node, you may revisit nodes multiple times, and you may reuse edges.
Β
Example 1:

Input: graph = [[1,2,3],[0],[0],[0]] Output: 4 Explanation: One possible path is [1,0,2,0,3]
Example 2:

Input: graph = [[1],[0,2,4],[1,3,4],[2],[1,2]] Output: 4 Explanation: One possible path is [0,1,4,2,3]
Β
Constraints:
n == graph.length
1 <= n <= 12
0 <= graph[i].length <Β n
graph[i]
does not containi
.- If
graph[a]
containsb
, thengraph[b]
containsa
. - The input graph is always connected.
Solution
Python3
class Solution:
def shortestPathLength(self, graph: List[List[int]]) -> int:
N = len(graph)
full_mask = (1 << N) - 1
visited = set()
queue = deque()
for node in range(N):
queue.append((node, 1 << node, 0))
visited.add((node, 1 << node))
while queue:
node, mask, edges = queue.popleft()
if mask == full_mask: return edges
for adj in graph[node]:
if (adj, mask | 1 << adj) not in visited:
visited.add((adj, mask | 1 << adj))
queue.append((adj, mask | 1 << adj, edges + 1))
return -1