LeetCode 847题解

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

欢迎各位小伙伴在评论区留言哦,��

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值