Problem Link

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 contain i.
  • If graph[a] contains b, then graph[b] contains a.
  • 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