Bit Manipulation
Breadth-First Search
Graph
Dynamic Programming
Bitmask
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.
Solutions
Solution 1
Python3 Java C++ Go TypeScript Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class Solution :
def shortestPathLength ( self , graph : List [ List [ int ]]) -> int :
n = len ( graph )
q = deque ()
vis = set ()
for i in range ( n ):
q . append (( i , 1 << i ))
vis . add (( i , 1 << i ))
ans = 0
while 1 :
for _ in range ( len ( q )):
i , st = q . popleft ()
if st == ( 1 << n ) - 1 :
return ans
for j in graph [ i ]:
nst = st | 1 << j
if ( j , nst ) not in vis :
vis . add (( j , nst ))
q . append (( j , nst ))
ans += 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class Solution {
public int shortestPathLength ( int [][] graph ) {
int n = graph . length ;
Deque < int []> q = new ArrayDeque <> ();
boolean [][] vis = new boolean [ n ][ 1 << n ] ;
for ( int i = 0 ; i < n ; ++ i ) {
q . offer ( new int [] { i , 1 << i });
vis [ i ][ 1 << i ] = true ;
}
for ( int ans = 0 ;; ++ ans ) {
for ( int k = q . size (); k > 0 ; -- k ) {
var p = q . poll ();
int i = p [ 0 ] , st = p [ 1 ] ;
if ( st == ( 1 << n ) - 1 ) {
return ans ;
}
for ( int j : graph [ i ] ) {
int nst = st | 1 << j ;
if ( ! vis [ j ][ nst ] ) {
vis [ j ][ nst ] = true ;
q . offer ( new int [] { j , nst });
}
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 class Solution {
public :
int shortestPathLength ( vector < vector < int >>& graph ) {
int n = graph . size ();
queue < pair < int , int >> q ;
bool vis [ n ][ 1 << n ];
memset ( vis , false , sizeof ( vis ));
for ( int i = 0 ; i < n ; ++ i ) {
q . emplace ( i , 1 << i );
vis [ i ][ 1 << i ] = true ;
}
for ( int ans = 0 ;; ++ ans ) {
for ( int k = q . size (); k ; -- k ) {
auto [ i , st ] <