路径压缩 (Path Compression)

简介: 路径压缩 (Path Compression) 是一种用于求解最短路径问题的算法,通常用于 Dijkstra 算法中,可以加速求解最短路径问题。路径压缩通过将已经确定的最短路径信息传递给未确定最短路径的节点,来加速最短路径的计算。具体来说,当一个节点的最短路径已经确定时,它会将这个信息传递给所有它的邻居节点,这样邻居节点就可以跳过一些不必要的计算,直接使用已经确定的最短路径信息,从而加速整个最短路径的计算过程。

路径压缩 (Path Compression) 是一种用于求解最短路径问题的算法,通常用于 Dijkstra 算法中,可以加速求解最短路径问题。
路径压缩通过将已经确定的最短路径信息传递给未确定最短路径的节点,来加速最短路径的计算。具体来说,当一个节点的最短路径已经确定时,它会将这个信息传递给所有它的邻居节点,这样邻居节点就可以跳过一些不必要的计算,直接使用已经确定的最短路径信息,从而加速整个最短路径的计算过程。
路径压缩通常用于以下情况:

  • 在 Dijkstra 算法中,当某个节点的最短路径已经确定时,可以使用路径压缩来加速其邻居节点的计算。
  • 在 Floyd 算法中,当某个节点的最短路径已经确定时,可以使用路径压缩来加速整个计算过程。
    以下是一个简单的示例,演示了如何在 Dijkstra 算法中使用路径压缩:

include

include

include

using namespace std;
const int INF = 0x3f3f3f3f; // 表示无穷大
struct Edge {
int to; // 边的终点
int weight; // 边的权重
Edge(int t, int w) : to(t), weight(w) {}
};
vector adj[100010]; // 存储图的邻接表
int dist[100010]; // 存储源点到各个点的最短距离
void dijkstra(int start) {
priority_queue, vector>, greater>> pq; // 小根堆,存储 (距离,点) 的二元组
pq.push(make_pair(0, start)); // 把源点放入堆中,距离为 0
dist[start] = 0; // 源点到自己的距离为 0
while (!pq.empty()) {
auto curr = pq.top();
pq.pop();
int currDist = curr.first, currNode = curr.second;
// 如果当前节点已经被处理过了,跳过
if (currDist != dist[currNode]) {
continue;
}
// 遍历当前节点的邻居
for (auto& edge : adj[currNode]) {
int nextNode = edge.to, nextDist = currDist + edge.weight;
// 如果通过当前节点到达邻居节点的距离更短,更新距离并加入堆中
if (nextDist < dist[nextNode]) {
dist[nextNode] = nextDist;
pq.push(make_pair(nextDist, nextNode));
}
}
}
}
int main() {
int n, m, start;
cin >> n >> m >> start;
// 初始化邻接表和距离数组
for (int i = 1; i < n; ++i) {
adj[i].clear();
dist[i] = INF;
}
// 读入边,建立邻接表
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(Edge(v, w));
}
// 使用 Dijkstra 算法计算最短路径
dijkstra(start);
// 输出结果
for (int i = 1; i <= n; ++i) {
cout << dist[i] << " ";
}
return 0;
}
CopyCopy

在上面的示例中,我们使用路径压缩来加速 Dijkstra 算法。具体来说,在遍历当前节点的邻居时,我们检查当前节点是否已经被处理过了,如果是,则跳过;否则,我们更新邻居节点的距离,并将其放入堆中。这样,我们就可以避免重复计算已经确定的最短路径,从而加速整个计算过程。

目录
相关文章
|
前端开发 算法 Java
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
🍅程序员小王的博客:程序员小王的博客 🍅CSDN地址:程序员小王java 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
3654 0
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
|
机器学习/深度学习 人工智能 算法
2019人工智能项目书籍汇总下载
python测试开发项目实战-目录 python工具书籍下载-持续更新 下面书籍下载地址 https://china-testing.github.io/ai_project_books.html 书籍:python人工智能项目 Intelligent Projects Using Pyth.
|
机器学习/深度学习 编解码 算法
DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
|
缓存 Ubuntu Linux
Docker Buildx 简介与安装指南
Docker Buildx 是一个强大的工具,提供了多架构构建、并行构建和高级缓存管理等功能。通过正确安装和配置 Buildx,可以显著提升 Docker 镜像的构建效率和灵活性。希望本文能帮助你更好地理解和使用 Docker Buildx,以提高开发和部署的效率。
7238 16
|
6月前
|
运维 监控 测试技术
2025年数据库性能压测工具对比:重点测试方案与工具选型指南
文章围绕2025年数据库性能压测工具展开,阐述其是保障系统性能核心环节。介绍主流方案有开源、SaaS化平台和私有化部署,各有适用场景。指出选型要关注指标、并发模型和业务架构适配性。还分析行业背景、压测挑战、解决方案类型及优劣势,给出选型关键考量,解答常见问题。
|
6月前
|
机器学习/深度学习 监控 安全
基于开源计算机视觉的餐饮场景智能化监控方案实践与实现
本文介绍一套可本地部署的餐饮视觉管理系统,基于YOLO、DeepSORT等模型实现客流统计、桌面识别、后厨安全监测、热力图分析与异常行为预警,支持低算力设备部署,模块化设计适配多场景,数据全本地化,保障隐私安全。
508 0
|
7月前
|
JSON 安全 API
京东API接口的应用场景介绍
京东API是京东开放平台提供的标准化接口,基于RESTful架构,支持商品查询、订单管理、支付、物流跟踪与营销数据分析等核心电商功能。通过OAuth 2.0认证保障安全,助力开发者高效构建集成应用。
|
移动开发 前端开发 JavaScript
JS配合canvas实现贪吃蛇小游戏_升级_丝滑版本_支持PC端和移动端
本文介绍了一个使用JavaScript和HTML5 Canvas API实现的贪吃蛇游戏的升级版本,该版本支持PC端和移动端,提供了丝滑的转向效果,并允许玩家通过键盘或触摸屏控制蛇的移动。代码中包含了详细的注释,解释了游戏逻辑、食物生成、得分机制以及如何响应不同的输入设备。
878 1
JS配合canvas实现贪吃蛇小游戏_升级_丝滑版本_支持PC端和移动端
|
前端开发 JavaScript Android开发
移动端点击事件:原理、问题与解决方案
前端技术在移动端点击事件上的应用,涉及触屏交互、响应速度优化及用户体验提升,确保网页或应用在手机等移动设备上流畅运行。
Threejs制作骨骼模型
这篇文章详细介绍了在Three.js中创建骨骼动画的过程,包括骨骼节点的创建、权重设置以及控制骨骼关节实现动态效果的步骤,并通过一个具体的圆柱体模型演示了如何添加和控制骨骼动画。
579 2