迪杰斯特拉(dijkstra)算法是单源最短路径问题的求解方法。参考链接:算法之迪杰斯特拉(dijkstra)非常详细介绍_PRML_MAN的博客-CSDN博客_迪杰斯特拉

使用上面的链接提供的图片进行测试

从v0(家)到v7(学校)的最短路径如下图所示

以上图片的邻接矩阵如下所示:

float G[][8] = {
     0,  4, 3, 10, -1, -1, -1, -1,
     4,  0,-1,  3,  8, -1, -1, -1,
     3, -1, 0,  5, -1, -1, 12, -1,
     10, 3, 5,  0,  3, 12, -1, -1,
     -1, 8,-1,  3,  0,  3, -1,  5,
     -1,-1,-1, 12,  3,  0, -1,  1,
     -1,-1,12, -1, -1, -1,  0,  2,
     -1,-1,-1, -1,  5,  2,  2,  0
    };

可以追溯路径的代码

#include <iostream>
#include <string>
#include <vector>void dij_learn();//函数声明
void main() {dij_learn();
}class node {//节点结构
public:int index;float way;std::vector<node*> childs;
};
node diji(float G[][8], int start, float end);//函数声明
node iterate_tree(node tree, int end, std::vector<node>* result);//函数声明
void dij_learn() {float G[][8] = {0,  4, 3, 10, -1, -1, -1, -1,4,  0,-1,  3,  8, -1, -1, -1,3, -1, 0,  5, -1, -1, 12, -1,10, 3, 5,  0,  3, 12, -1, -1,-1, 8,-1,  3,  0,  3, -1,  5,-1,-1,-1, 12,  3,  0, -1,  1,-1,-1,12, -1, -1, -1,  0,  2,-1,-1,-1, -1,  5,  2,  2,  0};diji(G, 0, 7);
}node diji(float G[][8], int start, float end) {//迪杰斯特拉方法//G表示一个图,start和end表示起点和重点(序号从0开始)//G中-1代表不邻接//初始化start节点node start_n;start_n.index = start;start_n.way = 0;std::vector<node*> N;//用于存放已经访问过的节点N.push_back(&start_n);node* min_node_father = new node();std::vector<int> visit(sizeof(G), 0);visit[start] = 1;//vector<int> dis(sizeof(G), INT_MAX);//该变量用于存储最短路径值while (1) {int min_point_index = -1;float min_dis = INT_MAX;for (int i = 0; i < N.size(); i++) {//遍历当前队列所有点的邻接点//查询G,即获得点的邻接点信息float* L = G[N[i]->index];for (int j = 0; j < sizeof(L); j++) {if (L[j] == -1 || visit[j] == 1 || i == j) {//已访问或不邻接的点跳过continue;}if (L[j] + N[i]->way < min_dis) {//记录最短路径min_node_father = N[i];min_point_index = j;min_dis = L[j] + N[i]->way;}}if (if_findend) {break;}}if (min_point_index == -1) {//当无法选出最短路径节点时,表面图已经结束,或者无法再继续搜寻break;}node* min_n = new node;min_n->index = min_point_index;min_n->way = min_node_father->way + G[min_node_father->index][min_point_index];min_node_father->childs.push_back(min_n);visit[min_point_index] = 1;N.push_back(min_n);min_node_father = nullptr;if (if_findend) {break;}}std::vector<node>* result = new std::vector<node>;//获取从tree到end的最短路径,结果存储在result里面node ways = iterate_tree(*N[0], end,result);result->push_back(ways);//最后将起点存入路径中return ways;
}
node iterate_tree(node tree, int end, std::vector<node>* result) {//获取从tree到end的最短路径,结果存储在result里面
//遍历迪杰斯特拉生成树,tree就是开头,end就是目的地node n;node null_node; null_node.index = -1;if (tree.index == end) {return tree;}else if (tree.childs.size() == 0 || tree.index == -1) {return null_node;}for (int i = 0; i < tree.childs.size(); i++) {n = iterate_tree(*tree.childs[i], end, result);if (n.index == end) {result->push_back(n);return tree;}else if (n.index != -1) {result->push_back(n);return tree;}}return null_node;
}

运行结果:(从v0到v7)0-1-3-4-5-7,way存储的是从原点到各个节点的最短路径

该算法在点云中的应用(计算近似测地线距离)

C++实现迪杰斯特拉(dijkstra)算法(最小生成树)相关推荐

  1. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  2. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  3. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  4. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  5. 最短路径算法-迪杰斯特拉(Dijkstra)算法

    最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...

  6. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  7. java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...

  8. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  9. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  10. 7-2 公路村村通 迪杰斯特拉(dijkstra)算法

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

最新文章

  1. PHP 可能在未来十年内消失?
  2. C发展史:KR C/C89/C99/C11 C++发展史: C++98/C++03/C++11
  3. 从URI中获取实际的文件path
  4. LeetCode -- 204. Count Primes
  5. mybatis generator修改默认生成的sql模板
  6. SMI/慧荣/SM32**主控量产通用教程,PNY U盘量产!
  7. 用LVM快照创建虚拟机
  8. uni-app路由的封装
  9. 操作系统原理(五)存储管理
  10. MySQL数据库开发的三十六条军规
  11. 用ping IP的方法测试网卡
  12. Mac M1 安装 iTerm2+Oh My Zsh+zsh-syntax-highlighting 真香!
  13. 新建raw data 分区
  14. U盘安装Ubuntu操作系统
  15. 支持全系列阵列卡的专用服务器PE工具
  16. 21世纪如何正确思考及开创个人事业(转发)
  17. JavaFX.控件讲解
  18. 计算机启动项在什么地方找,如何查看电脑开机启动项_系统开机启动项快捷键 - 学无忧...
  19. 腾讯与华中科技大学成立智能云存储技术联合研究中心
  20. 大数据与区块链的爱恨情仇,一场技术界相爱相杀的爱恋!

热门文章

  1. power bi公式运用
  2. 3. kafka开启JMX
  3. Oracle内存分配中的子池(Subpool)--ORA-04031
  4. DALSA线阵CCD开发纪要(C++)-- 缓冲区读
  5. Android简易实战教程--第五十四话《视差特效》
  6. 使用开源工具构建DevOps管道的初学者指南
  7. HTB Mailroom WriteUp
  8. 这就是不一样的你,不一样的烟火
  9. 复合自变量c语言,实验心理学
  10. Real-time noise-aware tone mapping阅读笔记