https://leetcode.com/problems/shortest-path-visiting-all-nodes/description/
题目大意:N个点组成的无向图,选一个起点遍历完所有点的最小步数。
解题思路:这题难点在于,走过的点可以重复走,如果直接暴力搜索不能确定停止的条件。
考虑用Bitset来表示目前已经遍历过的点的状态,和此时的点 即 dp[i][status]来表示到目前记录目前为止的最小距离,可以用BFS的方式搜索出遍历完所有点的最小距离。
class Solution { public int shortestPathLength(int[][] graph) { int n=graph.length; int[][] dp = new int[n][1<<n]; Queue<Pair> qt = new LinkedList<>(); for(int i=0;i<n;i++) { Arrays.fill(dp[i],999); qt.offer(new Pair(i,1<<i)); dp[i][1<<i] = 0; } int endStatus = (1<<n) -1; while(!qt.isEmpty()) { Pair pi = qt.poll(); int head = pi.head; int d = dp[head][pi.status]; //System.out.println(pi.status+" "+endStatus+" "+d); if( pi.status == endStatus) return d; for(int i=0;i<graph[head].length;i++) { int tmp = graph[head][i]; int tmpStatus = pi.status | (1<<tmp) ; if( d+1 < dp[tmp][tmpStatus]) { dp[tmp][tmpStatus] = d+1 ; qt.offer(new Pair(tmp,tmpStatus)); } } } return 0; } } class Pair{ public int head,status; public Pair(int head, int status) { this.head = head; this.status = status; } }