一、相关含义

1、Dijkstra算法在运行过程中维持的关键信息是一组结点集合S。从源结点s到该集合中每个结点之间的最短路径已经被找到。算法重复从结点集V- S中选择最短路径估计最小的结点u,将u加入到集合S,然后对所有从u发出的边进行松弛。在下面给出的实现方式中,我们使用一个最小优先队列Q来保存结点集合,每个结点的关键值为其d值。
2、要求:对于所有的边(u,v)∈E,都有w(u,v)>=0.

二、伪代码:

DIJKSTRA.(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)//对d和π进行初始化
S = ∅  //S初始为空集
Q = G.V    //最小优先队列Q初始为G的所有结点
while Q != ∅u = EXTRACT-MIN(Q)    //结点u是所有结点的最短路径估计S = S∪{u}for each vertex v ∈ G.Adj[u]RELAX(u,v,w)
初始化
INITIALIZE-SINGLE-SOURCE(G,s)
for each vertex v ∈ G.Vv.d = ∞v.π = NIL
s.d = 0
RELAX(u,v,w)
//在松弛操作中,如果一个点v的最短路径值大于u.d加上(u,v)的权重
if v.d > u.d + w(u,v)v.d = u.d + w(u,v)//更新v.dv.π = u    //让u直接成为v的前驱结点,因为u之前不是后者的前驱

三、C++代码

//这个程序做了很多具象化操作,就比如直接给出结点数量之类的,可以在用的时候适当修改。
#include <iostream>
#include<vector>
using namespace std;
struct Vertex
{int id;int d;//最短路径估计int pre;//前驱结点bool flag;Vertex(int i=99999,int pr = NULL, int di = 99999,int fl = 0) :id(i),pre(pr), d(di),flag(fl) {}
};//对边进行定义
struct Edge
{//起始点和终点Vertex start;Vertex final;int dist;//路程
};//带距离的有向图
struct Graph {//顶点数和边数int V;int E;Edge* edge;//指针
};//邻接矩阵(直接把数字写好了)横坐标为起始边
void AdjMatrix(int adjMat[][5])  //邻接矩阵表示法
{for (int i = 0; i < 5; i++)   //初始化邻接矩阵for (int j = 0; j < 5; j++){adjMat[i][j] = 99999; //初始化为99999}//对称矩阵,一共十条边adjMat[0][1] = 10;  adjMat[0][3] = 5;adjMat[1][2] = 1;  adjMat[1][3] = 2; adjMat[2][4] = 1; adjMat[3][1] = 3; adjMat[3][2] = 9; adjMat[3][4] = 2;adjMat[4][0] = 7; adjMat[4][2] = 6;
}//创建图
Graph* CreateGraph(int v, int e)
{Graph* graph = new Graph();graph->E = e;graph->V = v;graph->edge = new Edge();return graph;
}//具体算法
void Dijkstra(Graph* G,int adjMat[][5]) {vector<Vertex*>V;//默认0为源头Vertex* v0 = new Vertex(0,NULL,0,1);V.push_back(v0);for (int i = 1; i < 5; i++) {Vertex* v = new Vertex(i,NULL,99999,0);V.push_back(v);}int count = 0;//计数器int minIndex = 0;//循环四次while (count < 4) {for (int k = 1; k < 5; k++) {if (adjMat[minIndex][k] != 99999) {//松弛操作if (V[k]->d > V[minIndex]->d + adjMat[minIndex][k]) {V[k]->d = V[minIndex]->d + adjMat[minIndex][k];V[k]->pre = V[minIndex]->id;}}}//找到最小距离估计值int min = 99999;int temp = minIndex;for (int j = 0; j < 5; j++) {if (V[j]->d < min&&V[j]->flag==0){min = V[j]->d;temp = j;}}minIndex = temp;//代表V的第minIndex元素已经被使用V[minIndex]->flag = 1;count++;}//打印for (int i = 0; i < 5; i++) {cout << V[i]->d << " ";}
}//程序里暂时没有用到Edge,因为用邻接矩阵代替了。
int main()
{Graph*graph = CreateGraph(5,10);int adjMat[5][5] = { 0 };AdjMatrix(adjMat);Dijkstra(graph, adjMat);return 0;
}

《算法导论》24.3-Dijkstra(迪杰斯特拉)算法(含C++代码)相关推荐

  1. 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)

    简介      Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...

  2. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  3. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

  4. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...

  5. Dijkstra迪杰斯特拉算法 C++实现

    本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释.下面是我已经上传的代码资 ...

  6. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  7. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...

  8. dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...

  9. Dijkstra(迪杰斯特拉)算法

    一.简介 迪克斯特拉算法又名Dijkstra算法(属于贪心算法).Dijkstra算法是从一节点到其余各节点最短路径计算方法. 迪杰斯特拉算法以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想 ...

  10. 算法提升:图的Dijkstra(迪杰斯特拉)算法

    目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

最新文章

  1. java百度地图地名定位地址_百度地图定位显示省市区街道名称,非常实用
  2. Find a girl friend
  3. 在Windows下不使用密码远程登陆Linux
  4. 精述IBM的MQTT协议和MQTT-S协议
  5. 强强联手 SAP Ariba与苏宁易购共建中国企业智慧采购
  6. 后疫情时代:对话下一个 10 年的技术趋势
  7. [BZOJ1934][Shoi2007]Vote 善意的投票[最小割]
  8. linux mysql命令不存在_mysql命令、mysqldump命令找不到解决
  9. 用“文通慧视”识别屏幕或图片中的文字
  10. Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
  11. 为地图marker 设置网络图片
  12. c语言实验报告(四) 从键盘输入字符串a和字符串b,并在a串中的最小元素(不含结束符)后面插入字符串b....
  13. linux启动速度优化
  14. 查询oracle job命令,oracle命令之job详解
  15. 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...
  16. 发现讯时CMS4.5的几个问题
  17. 转载和积累系列 - 为什么 HashMap 加载因子是0.75?而不是0.8,0.6?
  18. 根据文件MD5删除重复文件
  19. mysql联合索引的使用规则
  20. python中set option_python的set_option选择

热门文章

  1. 超级炫酷的3D旋转动态图——Python代码实现
  2. 微软计算机系统的组成与功能,体系结构概述 - Configuration Manager | Microsoft Docs
  3. android象棋游戏,基于安卓的中国象棋游戏app
  4. 【操作系统】MIT 6.s081 LAB5
  5. 论ART上运行时 Method AOP实现
  6. jeecg-boot(Online表单 / 控件及代码生成菜单配置)
  7. 【附源码】Java计算机毕业设计勤工俭学管理小程序(程序+LW+部署)
  8. 小程序云开发添加内容审核和图片审核
  9. 游戏策划笔记:系统数值分析
  10. linux三剑客之sed命令精讲