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;
}
}