当前位置: 首页 > news >正文

【c++刷题笔记-图论】day62:Floyd 算法、A * 算法精讲

Floyd 算法

重点:多源最短路径算法,前的最短路径算法是单源的也就是只有一个起点。递推每个节点之间最短的路径

  • 时间复杂度: O(n^3)
  • 空间复杂度:O(n^2)
#include <iostream>
#include <vector>
using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, 10005));  // 因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2] = val;grid[p2][p1] = val; // 注意这里是双向图}// 开始 floydfor (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);}}}// 输出结果int z, start, end;cin >> z;while (z--) {cin >> start >> end;if (grid[start][end] == 10005) cout << -1 << endl;else cout << grid[start][end] << endl;}
}

A * 算法

重点:Astar关键在于启发式函数,也就是影响广搜或者 dijkstra 从容器(队列)里取元素的优先顺序

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int moves[1001][1001];
int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};
int b1, b2;
// F = G + H
// G = 从起点到该节点路径消耗
// H = 该节点到终点的预估消耗struct Knight{int x,y;int g,h,f;bool operator < (const Knight & k) const{  // 重载运算符, 从小到大排序return k.f < f;}
};priority_queue<Knight> que;int Heuristic(const Knight& k) { // 欧拉距离return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2); // 统一不开根号,这样可以提高精度
}
void astar(const Knight& k)
{Knight cur, next;que.push(k);while(!que.empty()){cur=que.top(); que.pop();if(cur.x == b1 && cur.y == b2)break;for(int i = 0; i < 8; i++){next.x = cur.x + dir[i][0];next.y = cur.y + dir[i][1];if(next.x < 1 || next.x > 1000 || next.y < 1 || next.y > 1000)continue;if(!moves[next.x][next.y]){moves[next.x][next.y] = moves[cur.x][cur.y] + 1;// 开始计算Fnext.g = cur.g + 5; // 统一不开根号,这样可以提高精度,马走日,1 * 1 + 2 * 2 = 5next.h = Heuristic(next);next.f = next.g + next.h;que.push(next);}}}
}int main()
{int n, a1, a2;cin >> n;while (n--) {cin >> a1 >> a2 >> b1 >> b2;memset(moves,0,sizeof(moves));Knight start;start.x = a1;start.y = a2;start.g = 0;start.h = Heuristic(start);start.f = start.g + start.h;astar(start);while(!que.empty()) que.pop(); // 队列清空cout << moves[b1][b2] << endl;}return 0;
}

总结

Floyd算法本质是动态规划,递推算出每个节点之间的最短距离。可以用于有负权值的最短路径。

Astar 是一种 广搜的改良版。 有的是 Astar是 dijkstra 的改良版。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从0开始搭建vue + flask 旅游景点数据分析系统(七):可视化前后端对接实现
  • 【超音速专利 CN109636858A】锂电池涂布图像采集标定方法、系统、设备及存储介质
  • Pod的调度机制
  • 深入探索 Wireshark——网络封包分析的利器
  • yolov8人脸识别案例
  • 设计模式 - 单例模式
  • 密码学基本理论
  • pnpm -C 什么意思
  • 量化投资策略与技术学习PART2:量化选股之风格轮动
  • Docker深入讲解
  • IOS企业IPA软件证书 苹果签名证书 有效期到2026年
  • VMware ESXi学习笔记
  • 【网络安全学习】SQL注入02:使用sqlmap进行注入
  • WPS宏实现对表格选中区域数据进行遍历读取及动态赋值
  • vs2022 开发vue带后端
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • express.js的介绍及使用
  • gcc介绍及安装
  • JavaScript函数式编程(一)
  • java第三方包学习之lombok
  • JDK 6和JDK 7中的substring()方法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Spring-boot 启动时碰到的错误
  • V4L2视频输入框架概述
  • vue-router 实现分析
  • Web Storage相关
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 缓存与缓冲
  • 前端存储 - localStorage
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 国内开源镜像站点
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # centos7下FFmpeg环境部署记录
  • #stm32驱动外设模块总结w5500模块
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)setTimeout 和 setInterval 的区别
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .htaccess配置常用技巧
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NetCore发布到IIS
  • .net中我喜欢的两种验证码
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Autowired自动装配