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.length1 <= n <= 120 <= graph[i].length <Β ngraph[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