我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用C++实现Dijkstra算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用C++实现Dijkstra算法

本篇内容介绍了“怎么使用C++实现Dijkstra算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

具体代码

1.graph类

graph类用于邻接表建立和保存有向图。

graph.h:

#ifndef GRAPH_H#define GRAPH_H#include <iostream>#include <string>#include <vector>#include <stdlib.h>using namespace std;// 定义顶点typedef struct EdgeNode {int adjvex;// 顶点下标struct  EdgeNode *next;// 下一条边的指针double cost;// 当前边的代价EdgeNode();~EdgeNode();} EdgeNode;// 定义顶点表typedef struct VexList{string Vexs;  //用来存储顶点信息EdgeNode *firstedge;  //用来存储当前顶点的下一个顶点VexList();~VexList();} VertexList;// 定义图typedef class GraphList {public:GraphList();~GraphList();void PrintGraph();// 打印图void CreateGraph();// 构建图vector<VexList> VexList;int Vertexs, Edges;} GraphList;typedef GraphList* GraphListPtr;#endif

graph.cpp

#include <graph.h>EdgeNode::EdgeNode() {cost = 0;next = nullptr;}EdgeNode::~EdgeNode() {//cout << "delete Node" << endl;}VexList::VexList() {firstedge = nullptr;}VexList::~VexList() {//cout << "delete VexList" << endl;}GraphList::GraphList() {VexList.clear();}GraphList::~GraphList() {//cout << "delete GraphList" << endl;}void GraphList::PrintGraph() {cout << "所建立的地图如以下所示:" << endl;for (int i = 0; i< Vertexs; i++) {cout << VexList[i].Vexs;             //先输出顶点信息EdgeNode * e = VexList[i].firstedge;while (e) {                           //然后就开始遍历输出每个边表所存储的邻接点的下标if (e->cost == -1) {cout << "---->" << e->adjvex;}else {cout << "-- " << e->cost << " -->" << e->adjvex;}e = e->next;}cout << endl;}}void GraphList::CreateGraph() {EdgeNode *e = new EdgeNode();cout << "请输入顶点数和边数:" << endl;cin >> Vertexs >> Edges;cout << "请输入顶点的信息:" << endl;for (int i = 0; i <Vertexs; ++i) {VertexList tmp;cin >> tmp.Vexs;tmp.firstedge = NULL;VexList.push_back(tmp);}for (int k = 0; k < Edges; ++k) {int i, j;//(Vi,Vj)double cost;cout << "请输入边(Vi,Vj)与 cost:" << endl;cin >> i >> j >> cost;if (VexList[i].firstedge == NULL) {//当前顶点i后面没有顶点e = new EdgeNode;e->adjvex = j;e->cost = cost;e->next = NULL;VexList[i].firstedge = e;}else {  //当前i后面有顶点EdgeNode *p = VexList[i].firstedge;while (p->next) {p = p->next;}e = new EdgeNode;e->adjvex = j;e->cost = cost;e->next = NULL;p->next = e;}}}

2.PathFinder类

PathFinder类用于搜索最短路径

pathFinder.h

#ifndef PATH_FINDER_H#define PATH_FINDER_H#include <iostream>#include <graph.h>#include <queue>enum State{OPEN = 0, CLOSED, UNFIND};// 定义dijkstra求解器class DijNode {public:DijNode();DijNode(double _val);~DijNode() {};double getCost() { return m_cost; }State getState() { return m_state; }void setCost(double _val) { m_cost = _val; }void setState(State _state) { m_state = _state; }int getIndex() { return m_index; }void setIndex(int _idx) { m_index = _idx; }void setPred(DijNode* _ptr) { preNode = _ptr; }DijNode* getPred() { return preNode; }VertexList Vertex;private:int m_index;double m_cost;// 起点到当前点的代价State m_state;DijNode* preNode;// 保存父节点};typedef DijNode* DijNodePtr;// 构造优先队列用的struct cmp {bool operator() (DijNodePtr &a, DijNodePtr &b) {return a->getCost() > b->getCost();}};class PathFinder {public:priority_queue<DijNodePtr, vector<DijNodePtr>, cmp > openList;//用优先队列做openList,队首元素为最小值vector<DijNodePtr> m_path;// 存放最终路径PathFinder() {openList.empty();m_path.clear();}~PathFinder() {};void StoreGraph(GraphListPtr _graph);void Search(int start, int end);void retrievePath(DijNodePtr _ptr);vector<DijNodePtr> NodeList;private:GraphListPtr m_graph;};typedef PathFinder* PathFinderPtr;#endif

PathFinder.cpp

#include <PathFinder.h>DijNode::DijNode() {m_cost = -1;// -1表示未被探索过,距离为无穷,非负数表示已经被探索过m_index = -1;m_state = UNFIND;// OPEN表示openlist, CLOSED表示在closeList中,UNFIND表示未探索过preNode = nullptr;}DijNode::DijNode(double _val) {m_cost = _val;// -1表示未被探索过,非负数表示已经被探索过m_index = -1;m_state = UNFIND;// OPEN表示openlist, CLOSED表示在closeList中,UNFIND表示未探索过preNode = nullptr;}void PathFinder::StoreGraph(GraphListPtr _graph) {for (int i = 0; i < _graph->VexList.size(); ++i) {DijNodePtr node = new DijNode();node->Vertex = _graph->VexList[i];node->setIndex(i);NodeList.push_back(node);}}void PathFinder::Search(int start, int end) {// 搜索起点DijNodePtr m_start = NodeList[start];m_start->setCost(0);m_start->setIndex(start);m_start->setState(OPEN);openList.push(m_start);int count = 0;while (!openList.empty()) {// 弹出openList中的队首元素DijNodePtr cur = openList.top();cur->setState(CLOSED);// 加入closelist中openList.pop();// 遍历队首元素所有的边EdgeNode *e = cur->Vertex.firstedge;while (e != nullptr) {int _index = e->adjvex;double _cost = e->cost;//cout << "_cost = " << _cost << endl;// 如果节点在close list中,直接跳过if (NodeList[_index]->getState() == CLOSED) {continue;}if (NodeList[_index]->getCost() == -1) {NodeList[_index]->setCost(cur->getCost() + _cost);// 更新代价NodeList[_index]->setPred(cur);// 更新父节点NodeList[_index]->setState(OPEN);// 加入open list中openList.push(NodeList[_index]);}else if (cur->getCost() + _cost < NodeList[_index]->getCost()) {// 如果从当前节点到第_index个节点的距离更短,更新距离和父节点NodeList[_index]->setCost(cur->getCost() + _cost);// 更新代价NodeList[_index]->setPred(cur);// 更新父节点NodeList[_index]->setState(OPEN);// 加入open list中}e = e->next;}}cout << "最短距离为:" << NodeList[end]->getCost() << endl;retrievePath(NodeList[end]);}void PathFinder::retrievePath(DijNodePtr ptr) {while (ptr != nullptr) {m_path.push_back(ptr);ptr = ptr->getPred();}reverse(m_path.begin(),m_path.end());}

3. main.cpp

主函数

#include <graph.h>#include <PathFinder.h>int main() {cout << "构建地图" << endl;GraphListPtr graph = new GraphList();graph->CreateGraph();cout << "\n \n";graph->PrintGraph();PathFinderPtr _solver = new PathFinder();_solver->StoreGraph(graph);cout << "\n \n";int start, end;cout << "输入起点" << endl;cin >> start;cout << "输入终点" << endl;cin >> end;cout << "\n \n";_solver->Search(start, end);cout << "最短路径为:"; for (int i = 0; i < _solver->m_path.size(); ++i) { cout << _solver->m_path[i]->Vertex.Vexs ; if (i < _solver->m_path.size() - 1) cout << "-->";}cout << endl;system("pause");return 0;}

示例

怎么使用C++实现Dijkstra算法

怎么使用C++实现Dijkstra算法

“怎么使用C++实现Dijkstra算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用C++实现Dijkstra算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用C++实现Dijkstra算法

本篇内容介绍了“怎么使用C++实现Dijkstra算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码1.graph类graph类用于
2023-07-02

Dijkstra算法原理及C++怎么实现

这篇文章主要介绍“Dijkstra算法原理及C++怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Dijkstra算法原理及C++怎么实现”文章能帮助大家解决问题。什么是最短路径问题如果从图中
2023-07-02

C++最短路径Dijkstra算法如何实现

这篇文章主要介绍“C++最短路径Dijkstra算法如何实现”,在日常操作中,相信很多人在C++最短路径Dijkstra算法如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++最短路径Dijkstra
2023-07-05

Python使用邻接矩阵实现图及Dijkstra算法问题

这篇文章主要介绍了Python使用邻接矩阵实现图及Dijkstra算法问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-16

C++最短路径Dijkstra算法的分析与具体实现详解

经典的求解最短路径算法有这么几种:广度优先算法、Dijkstra算法、Floyd算法。本文是对 Dijkstra算法的总结,该算法适用于带权有向图,可求出起始顶点到其他任意顶点的最小代价以及对应路径,希望对大家有所帮助
2023-03-10

python中怎么利用Dijkstra算法求最短路径

python中怎么利用Dijkstra算法求最短路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  从某源点到其余各顶点的最短路径  Dijkstra算法可用
2023-06-02

C#怎么使用符号表实现查找算法

今天小编给大家分享一下C#怎么使用符号表实现查找算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。高效检索海量信息(经典查找
2023-06-30

怎么使用C++动态规划算法实现矩阵链乘法

这篇文章主要介绍“怎么使用C++动态规划算法实现矩阵链乘法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C++动态规划算法实现矩阵链乘法”文章能帮助大家解决问题。问题描述:给定n个矩阵的链<
2023-07-02

如何使用C/C++实现马踏棋盘算法

这篇文章主要介绍如何使用C/C++实现马踏棋盘算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下问题描述:将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规
2023-06-29

python中怎么利用Dijkstra算法规划机器人路径

今天就跟大家聊聊有关python中怎么利用Dijkstra算法规划机器人路径,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、算法原理如图所示,Dijkstra算法要解决的是一个有向
2023-06-20

C++归并排序算法怎么实现

这篇文章主要介绍“C++归并排序算法怎么实现”,在日常操作中,相信很多人在C++归并排序算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++归并排序算法怎么实现”的疑惑有所帮助!接下来,请跟着小编
2023-06-26

C++中怎么实现一个 kmp算法

本篇文章给大家分享的是有关C++中怎么实现一个 kmp算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++ kmp算法模板参数说明const T *source 待匹配的字
2023-06-17

C#中Astar寻路算法怎么实现

以下是一种基本的A*寻路算法的实现示例,可以用于C#语言:```csharpusing System;using System.Collections.Generic;public class Node{public int X { get
2023-09-22

C语言怎么实现扫雷算法

这篇文章主要讲解了“C语言怎么实现扫雷算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么实现扫雷算法”吧!扫雷分析从小到大你或许没玩过但一定听过的游戏——扫雷首先我们来分一下“扫雷
2023-06-20

C++ STL中常用算法怎么使用

这篇文章主要讲解了“C++ STL中常用算法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++ STL中常用算法怎么使用”吧!前言在C++中使用STL算法都要包含一个算法头文件 #
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录