LeetCode 847 访问所有结点的最短路径长度
题目描述
**给出 graph 为有 N 个节点(编号为 0, 1, 2, …, N-1)的无向连通图。
graph.length = N,且只有节点 i 和 j 连通时,j != i 在列表 graph[i] 中恰好出现一次。
返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重用边。
示例 1:
输入:[[1,2,3],[0],[0],[0]]
输出:4
解释:一个可能的路径为 [1,0,2,0,3]
示例 2:
输入:[[1],[0,2,4],[1,3,4],[2],[1,2]]
输出:4
解释:一个可能的路径为 [0,1,4,2,3]
提示:
1 <= graph.length <= 12
0 <= graph[i].length < graph.length
题目大意
从所给**列表中找出一条可以访问所有结点的最短路径,返回它的长度。采用bfs进行搜索每个结点,创建一个二维数组dp[i][1<
class Solution {
public int shortestPathLength(int[][] graph) {
int len = graph.length;
int dp[][] = new int[len][1<<len];
LinkedList<Pair> q = new LinkedList<>();
for(int i = 0;i<len;i++){
Arrays.fill(dp[i],1<<12);
dp[i][1<<i] = 0;
q.add(new Pair(i,1<<i));
}
while(!q.isEmpty()){
Pair cur = q.removeFirst();
for(int j:graph[cur.a]){
if(dp[j][1<<j|cur.mark]>dp[cur.a][cur.mark]+1){
dp[j][1<<j|cur.mark]=dp[cur.a][cur.mark]+1;
q.add(new Pair(j,1<<j|cur.mark));
}
}
}
int res = Integer.MAX_VALUE;
for(int i = 0;i<len;i++){
res = Math.min(res,dp[i][(1<<len)-1]);
}
return res;
}
class Pair{
public int mark,a;
public Pair(int b,int t){
mark = t;
a = b;
}
}
}
欢迎各位小伙伴在评论区留言哦,��