leetcode 访问所有子节点的最短路径

思路与算法
由于题目需要我们求出「访问所有节点的最短路径的长度」,并且图中每一条边的长度均为 11,因此我们可以考虑使用广度优先搜索的方法求出最短路径。
在常规的广度优先搜索中,我们会在队列中存储节点的编号。对于本题而言,最短路径的前提是「访问了所有节点」,因此除了记录节点的编号以外,我们还需要记录每一个节点的经过情况。因此,我们使用三元组 表示队列中的每一个元素,再进行遍历。具体见链接:
链接:https://leetcode-cn.com/problems/shortest-path-visiting-all-nodes/solution/fang-wen-suo-you-jie-dian-de-zui-duan-lu-mqc2/
class Solution { public int shortestPathLength(int[][] graph) { int n = graph.length; Queue<int[]> queue = new LinkedList<int[]>(); boolean[][] seen = new boolean[n][1 << n]; for (int i = 0; i < n; ++i) { queue.offer(new int[]{i, 1 << i, 0}); seen[i][1 << i] = true; } int ans = 0; while (!queue.isEmpty()) { int[] tuple = queue.poll(); int u = tuple[0], mask = tuple[1], dist = tuple[2]; if (mask == (1 << n) - 1) { ans = dist; break; } // 搜索相邻的节点 for (int v : graph[u]) { // 将 mask 的第 v 位置为 1 int maskV = mask | (1 << v); if (!seen[v][maskV]) { queue.offer(new int[]{v, maskV, dist + 1}); seen[v][maskV] = true; } } } return ans; } }

浙公网安备 33010602011771号