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 访问所有结点的最短路径