可重复经过点和路径的覆盖问题

可重复经过点和路径的覆盖问题

算法概论第十一周


847. Shortest Path Visiting All Nodes —— 题目链接

题目描述

An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph.

graph.length = N, and j != i is in the list graph[i] exactly once, if and only if nodes i and j are connected.

Return the length of the shortest path that visits every node. You may start and stop at any node, you may revisit nodes multiple times, and you may reuse edges.

 

Example 1:

Input: [[1,2,3],[0],[0],[0]]
Output: 4
Explanation: One possible path is [1,0,2,0,3]
Example 2:

Input: [[1],[0,2,4],[1,3,4],[2],[1,2]]
Output: 4
Explanation: One possible path is [0,1,4,2,3]
 

Note:

1 <= graph.length <= 12
0 <= graph[i].length < graph.length

思路分析

状态定义

  • 由于路径可以重复使用,而且目标是把所有点经过一遍,于是可以尝试搜索所有的状态
  • 每一个状态 S t a t e State State可以定义为 S t a t e = { C o v e r , C u r r } State = \{Cover,Curr\} State={Cover,Curr} C o v e r Cover Cover 表示当前状态已经经过了哪些节点,可以使用状态压缩表示, C u r r Curr Curr表示当前在哪个节点
  • 有两种搜索状态的方法

BFS

  • 初始化一个记录二位数组dist[状态总数][节点总数],用于记录每个状态的最短路径,初始化为无限大
  • 一开始加入所有节点分别的初始出发状态进入队列
  • 开始不断从队列取出状态
    • 如果状态为覆盖所有点,返回距离
    • 否则根据当前节点,查看所有与当前节点连接的点,尝试转移到这些点
    • 如果转移的结果能缩短该状态的最短路径,将该状态加入队列
  • 由于是BFS,可以保证找到最优解

实现代码

class Solution {
    public int shortestPathLength(int[][] graph) {
        int N = graph.length;
        Queue<State> queue = new LinkedList();
        int[][] dist = new int[1<<N][N];
        for (int[] row: dist) Arrays.fill(row, 1000000000);

        for (int x = 0; x < N; ++x) {
            queue.offer(new State(1<<x, x));
            dist[1 << x][x] = 0;
        }

        while (!queue.isEmpty()) {
            State node = queue.poll();
            int d = dist[node.cover][node.head];
            if (node.cover == (1<<N) - 1) return d;

            for (int child: graph[node.head]) {
                int cover2 = node.cover | (1 << child);
                if (d + 1 < dist[cover2][child]) {
                    dist[cover2][child] = d + 1;
                    queue.offer(new State(cover2, child));

                }
            }
        }

        throw null;
    }
}

class State {
    int cover, head;
    State(int c, int h) {
        cover = c;
        head = h;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A星(A*)全覆盖路径规划是一种常用于解决寻找最优路径问题的算法,它被广泛应用于自动驾驶、机器人导航等领域。该算法通过综合考虑路径长度和起到终的估计距离来进行路径搜索,以找到全覆盖的最优解。 A*算法的核心思想是通过维护一个开放列表和一个闭合列表来实现路径搜索。开放列表存储待评估的路径节点,闭合列表存储已经评估过的路径节点。在每一步迭代中,从开放列表中选择一个节点,通过计算估计距离公式得到该节点的估计代价(F值),并将其与其他节点进行比较。根据F值的大小,选择最优的节点作为下一步的扩展节点。 在进行路径搜索时,除了考虑路径长度外,A*算法还引入了启发式函数来估计当前节点到目标节点的距离。通过选择合适的启发式函数,可以提高算法的效率和准确性。例如,可以使用曼哈顿距离或欧几里得距离作为估计值,以便更准确地评估节点的代价。 A*算法在搜索过程中具有一定的优化能力。为了尽量避免搜索无用路径重复搜索已经处理过的节点,算法会利用启发式函数的信息,动态调整搜索方向。这种优化机制可以有效减少搜索空间,提高搜索效率。 总而言之,A*全覆盖路径规划算法通过综合考虑路径长度和启发式函数估计值,以寻找最优路径。它具有高效、准确的特,并广泛应用于各种实际问题中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值