题目描述:
示例 1:

示例 2:

题目分析:
- 等权(权可以看作1)无向图求最短路径问题
- 可以从任意节点开始
- 节点可以重复访问
- 最多12个节点,1 <= n <= 12
思路分析:
- 访问第 i 个点的状态(1表示已经访问过) : state = 1 & (i >>1)
- 更改第 i 个点状态为1 : mark = mark | (1 << i)
- 判断row个节点是否已经全部遍历:mark = 2^n - 1;
代码实现:
class Solution {
public int shortestPathLength(int[][] graph) {
int row = graph.length;
boolean[][] flag = new boolean[row][1 << row];
Queue<int[]> queue = new LinkedList();
for (int i = 0; i < row; i++) {
queue.offer(new int[]{i, 1 << i, 0}); // 可以任意起点,将所有节点初始化到queue.
flag[i][1 << i] = true;
}
while (!queue.isEmpty()) {
int[] temp = queue.poll();
int node = temp[0]; // 当前节点
int mark = temp[1]; // 当前节点状态
int result = temp[2]; // 当前走过的路径(权值和)
if (mark == (1 << row) - 1) return result; // 节点已经全部遍历.
for (int num : graph[node]) {
int nextMark = mark | (1 << num); // 修改num节点点状态
if (!flag[num][nextMark]) {
queue.offer(new int[]{num, nextMark, result + 1}); // 扩展下一轮节点.
flag[num][nextMark] = true; // 标记已经访问的节点.
}
}
}
return 0;
}
}