当前位置: 首页 > 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 的改良版。

http://www.lryc.cn/news/418846.html

相关文章:

  • FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真
  • Java中的分布式日志与追踪
  • 案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践
  • 数字化时代:传统行业的转型之路在何方?
  • 【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载
  • 【生成式人工智能-八-大型语言模型的能力评估】
  • Qt ts文件详解
  • 操作系统 IO 相关知识
  • C++_手写share_ptr
  • 【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案
  • vue设置每次加载页面时展示一个双开门效果
  • 简单的docker学习 第8章 docker常用服务安装
  • 01、MySQL-DDL(数据定义语言)
  • RT-Thread 操作系统 之 线程间同步 IO设备模型
  • 力扣leetcode移动0(C++)
  • 阿里云部署open-webui实现openai代理服务
  • 你的工作环境,选对劳保鞋了吗?守护安全,从脚下开始!
  • 【Linux】编译器gcc/g++ 、程序翻译过程、动静态库
  • 通义灵码-阿里云推出的AI智能编码助手
  • 构建智能生态,视频监控/安防监控EasyCVR视频汇聚流媒体技术在智能分析领域的应用
  • LeetCode Hard|【460. LFU 缓存】
  • 积极参与全球能源科技前沿对话,海博思创推动绿色低碳发展
  • [工具]-ffmpeg-笔记
  • Android Fragment:详解,结合真实开发场景Navigation
  • JavaWeb中的Servlet
  • SpringBoot AOP 简单的权限校验
  • Java生成Word->PDF->图片:基于poi-tl 进行word模板渲染
  • JVM内存模型笔记
  • 每日一练 - eSight 网管远程告警通知方式
  • [matlab] 鲸鱼优化算法优化KNN分类器的特征选择