0
点赞
收藏
分享

微信扫一扫

访问所有节点的最短路径

以沫的窝 2021-09-21 阅读 49
今日算法
题目描述:
示例 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;
    }
}
举报

相关推荐

0 条评论