一个有向带权图求它的单源最短路径可以使用Dijkstra算法。

单源最短路径是指:从图中的某个顶点出发,到其余各个顶点权值最小的路径。

Dijkstra算法需要用到三个辅助数组:

  • dist[max]:记录当前出发点v到其余各个点的最短权值之和(包括自己,为0);
  • path[max]:记录当前每个结点在最短权值路径的状态下的前驱结点;
  • s[max]:记录当前状态下的每个结点是否被访问过,访问过为1,没访问为0;

(max为图的顶点数)

Dijkstra算法由于要不断地访问顶点之间的边的信息,所以更适合将图用邻接矩阵进行存储。

本文关于Dijkstra算法的思想就不再赘述,主要是分享Dijkstra算法的代码实现。

算法的核心代码:

void Dijkstra(Mgraph G,int v) {int num = 0;int min = 0;int s[MAX];int dist[MAX];int path[MAX];for (int i = 0; i < G.vexnum; i++){dist[i] = G.arc[v][i];if (dist[i] != INF) path[i] = v;else path[i] = -1;}for (int i = 0; i < G.vexnum; i++){s[i] = 0;}s[v] = 1;num = 1;//在未访问的结点中更新dist和path数组以及s数组while (num < G.vexnum){min = FindMinDist(dist, s, G); //寻找最小的权值结点s[min] = 1;for (int i = 0; i < G.vexnum; i++){if (s[i] == 0 && (dist[i] > dist[min] + G.arc[min][i])){dist[i] = dist[min] + G.arc[min][i];path[i] = min;}}num++;}//打印输出结果:for (int i = 0; i < G.vexnum; i++){cout << dist[i] << " ";}cout << endl;for (int i = 0; i < G.vexnum; i++){cout << path[i] << " ";}
}

完整代码:

#include<iostream>
using namespace std;
#define MAX 9
#define INF 9999
typedef struct Mgraph {char Vexnum[MAX]; //图的顶点信息int arc[MAX][MAX];//二维数组存储顶点之间的边的权值信息int vexnum;//图的顶点数int edgenum;//图的边数
};
//创建图
void CreatM(Mgraph& G)
{int i, j, w;cout << "请输入图的顶点数和边数" << endl;cin >> G.vexnum >> G.edgenum;cout << "请输入顶点信息" << endl;for (int i = 0; i < G.vexnum; i++){cin >> G.Vexnum[i];}//初始化二维数组的边的权值为INFfor (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){if(i == j) G.arc[i][j] = 0;else G.arc[i][j] = INF;}}//更改二维数组中边的权值为输入进来的权值for (int k = 0; k < G.edgenum; k++){cout << "请输入边(Vi,Vj)的下标i,j和权重w: " << endl;cin >> i >> j >> w;G.arc[i][j] = w;}
}
void MyPrint(Mgraph G) {cout << "创建的图的邻接矩阵如下所示: " << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){cout << G.arc[i][j] << "   ";}cout << endl;}
}
//在dist数组中找s[i] = 0,权值最小的数组下标。
int FindMinDist(int *pdist,int *s, Mgraph G) {int num = G.vexnum;int min = INF;for (int i = 0; i < num; i++){if (pdist[i] < min && s[i] == 0){min = i;}}return min;
}
//算法核心
void Dijkstra(Mgraph G,int v) {int num = 0;int min = 0;int s[MAX];int dist[MAX];int path[MAX];for (int i = 0; i < G.vexnum; i++){dist[i] = G.arc[v][i];if (dist[i] != INF) path[i] = v;else path[i] = -1;}for (int i = 0; i < G.vexnum; i++){s[i] = 0;}s[v] = 1;num = 1;while (num < G.vexnum){min = FindMinDist(dist, s, G);s[min] = 1;for (int i = 0; i < G.vexnum; i++){if (s[i] == 0 && (dist[i] > dist[min] + G.arc[min][i])){dist[i] = dist[min] + G.arc[min][i];path[i] = min;}}num++;}for (int i = 0; i < G.vexnum; i++){cout << dist[i] << " ";}cout << endl;for (int i = 0; i < G.vexnum; i++){cout << path[i] << " ";}
}
int main() {Mgraph G;CreatM(G);//MyPrint(G);Dijkstra(G,0);return 0;
}

执行结果:

图的最短路径之Dijkstra求单源最短路径算法(C++)相关推荐

  1. Dijkstra 求单源最短路径

    #include "stdafx.h" #include <iostream> using namespace std ;#include <vector> ...

  2. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  3. Dijkstra算法求单源最短路径

    1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶 ...

  4. 最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)

    最短路径: 在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径. DiskStra算法: 求单源最短路径,即 ...

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

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

  6. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  7. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

  8. Spark组件之GraphX学习9--使用pregel函数求单源最短路径

    http://www.voidcn.com/blog/xubo245/article/p-5930144.html 1解释 使用pregel函数求单源最短路径 GraphX中的单源点最短路径例子,使用 ...

  9. PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:dijkstra求单源最短路的题目. 只是写两遍而已,第一遍求按照路径长度求,第二遍按照时间最少求. 另外加一个vector路径的判断 ...

最新文章

  1. 以下选项不是python打开方式的是-模拟试卷 A
  2. 面向对象C语言编程--抽象数据类型-AbstractDataTypes
  3. java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?
  4. dede 5.7 任意用户重置密码前台
  5. 如何实现Punycode中文域名转码
  6. 火狐浏览器工具栏/折叠菜单怎么设置?火狐浏览器工具栏/折叠菜单定制教程
  7. IOS-简单WebView的使用
  8. SQL 判断表是否存在
  9. qtp 连接mysql_QTP连接mysql数据库
  10. 爬虫笔记之实战(一):爬取猫眼电影排行
  11. 佳能Canon MF4700 一体机驱动
  12. 2×3卡方检验prism_SPSS之卡方检验
  13. Python 批量汉字转五笔,Word输出为Excel
  14. [Other]B树 B+树 B*树 - 三大名树的基础简介
  15. [已解决]批处理查看文件大小的字节怎样转换成KB和MB?
  16. ❤️ 6个Python办公黑科技,工作效率提升100倍!HR小姐姐都馋哭了(附代码)❤️
  17. 计算机网络行业规范的主要内容,计算机网络专业论文
  18. 信息系统项目管理师教程(第3版)- OSI七层模型TCP/IP四层模型对应网络协议
  19. SQL Server 2008服务器
  20. SCA工具对比分析和应用解读「超全」

热门文章

  1. android读取不到自定义颜色属性,android – 如何从AttributeSet中可靠地获取颜色?...
  2. Markdown键盘样式,文献引用
  3. m132nw与m132snw差异_纠结m132nw与m132snw差异哪个好?详解区别有吗?
  4. 协方差的拆分、加减计算公式,看这一页就够了
  5. UDS的0x19服务介绍
  6. 苹果加大对高通攻击力度 或击溃高通核心商业模式
  7. windows C++客户端开发技术栈(C++应用开发技术栈)
  8. 酷播云的视频数据统计与受众分析功能
  9. 通信电子线路之“如何减少天线尺寸,提高信号的发送频率”
  10. Timer实现定时任务