C++实现迪杰斯特拉(dijkstra)算法(最小生成树)
迪杰斯特拉(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)算法(最小生成树)相关推荐
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题
1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 迪杰斯特拉(Dijkstra)算法解决最短路径问题
Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法
最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- java实现迪杰斯特拉(Dijkstra)算法求解最短路问题
迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...
- 数据结构——图——迪杰斯特拉(Dijkstra )算法
数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 7-2 公路村村通 迪杰斯特拉(dijkstra)算法
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...
最新文章
- PHP 可能在未来十年内消失?
- C发展史:KR C/C89/C99/C11 C++发展史: C++98/C++03/C++11
- 从URI中获取实际的文件path
- LeetCode -- 204. Count Primes
- mybatis generator修改默认生成的sql模板
- SMI/慧荣/SM32**主控量产通用教程,PNY U盘量产!
- 用LVM快照创建虚拟机
- uni-app路由的封装
- 操作系统原理(五)存储管理
- MySQL数据库开发的三十六条军规
- 用ping IP的方法测试网卡
- Mac M1 安装 iTerm2+Oh My Zsh+zsh-syntax-highlighting 真香!
- 新建raw data 分区
- U盘安装Ubuntu操作系统
- 支持全系列阵列卡的专用服务器PE工具
- 21世纪如何正确思考及开创个人事业(转发)
- JavaFX.控件讲解
- 计算机启动项在什么地方找,如何查看电脑开机启动项_系统开机启动项快捷键 - 学无忧...
- 腾讯与华中科技大学成立智能云存储技术联合研究中心
- 大数据与区块链的爱恨情仇,一场技术界相爱相杀的爱恋!