2018-10-06 22:04:38
问题描述:
问题求解:
本题要求是求遍历所有节点的最短路径,由于本题中是没有要求一个节点只能访问一次的,也就是说可以访问一个节点多次,但是如果表征两次节点状态呢?可以使用(curNode, VisitedNode)来进行表征,如果两次的已经访问的节点相同那么就没有必要再进行访问了,最终的状态就是所有节点都访问过了。
另外,由于起点对结果是有影响的,因此在最开始需要将所有的节点都压栈。
public int shortestPathLength(int[][] graph) { int n = graph.length; if (n == 1) return 0; int goal = (1 << n) - 1; int[][] used = new int[n][1 << n]; Queue<int[]> queue = new LinkedList<>(); for (int i = 0; i < n; i++) { queue.add(new int[]{i, 1 << i}); used[i][1 << i] = 1; } int step = 0; while (!queue.isEmpty()) { int size = queue.size(); step++; for (int i = 0; i < size; i++) { int[] cur = queue.poll(); int node = cur[0]; int state = cur[1]; for (int k : graph[node]) { int newState = state | (1 << k); if (newState == goal) return step; if (used[k][newState] == 1) continue; queue.add(new int[]{k, newState}); used[k][newState] = 1; } } } return -1; }