LeetCode 847 访问所有节点的最短路径[BFS] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 847 访问所有节点的最短路径[BFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路:
又是一道比较复杂的图论题目,首先构建三元数组,存储节点+访问路径+路径长度,再构建一个访问数组,表示节点到其他节点是否访问过,访问过的路径不可重复访问(有方向性),利用BFS,先把所有点加入到队列中,遍历其能访问到的下一节点,并更新访问位置和路径长度,以及访问数组,当遇到某点的访问位置为所有位置,则退出,该三元组对应的路径长度就是最短路径,代码如下:

class Solution {
public:
    int shortestPathLength(vector<vector<int>>& graph) {
        int n = graph.size();
        queue<tuple<int, int, int>> q;
        vector<vector<int>> seen(n, vector<int>(1 << n));
        for (int i = 0; i < n; ++i) {
            q.emplace(i, 1 << i, 0);
            seen[i][1 << i] = true;
        }

        int ans = 0;
        while (!q.empty()) {
            auto [u, mask, dist] = q.front();
            q.pop();
            if (mask == (1 << n) - 1) {
                ans = dist;
                break;
            }
            // 搜索相邻的节点
            for (int v: graph[u]) {
                // 将 mask 的第 v 位置为 1
                int mask_v = mask | (1 << v);
                if (!seen[v][mask_v]) {
                    q.emplace(v, mask_v, dist + 1);
                    seen[v][mask_v] = true;
                }
            }
        }
        return ans;
    }
};

以上是关于LeetCode 847 访问所有节点的最短路径[BFS] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《动态规划 - 状态压缩DP》困难01 —— LeetCode 847. 访问所有节点的最短路径

LeetCode802. 找到最终的安全状态(图论三色标记法拓扑排序)/847. 访问所有节点的最短路径(特殊的bfs,状态压缩,dp)

[LeetCode] 847. Shortest Path Visiting All Nodes 访问所有结点的最短路径

leetcode 847. Shortest Path Visiting All Nodes 无向连通图遍历最短路径

访问所有节点的最短路径

访问所有节点的最短路径