数据结构--迪杰斯特拉(Dijkstra)算法

这篇具有很好参考价值的文章主要介绍了数据结构--迪杰斯特拉(Dijkstra)算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生活封锁了我们,只要我们的心不死,生活便永远不是一汪死水,而我们,依然会绽放最美的姿态。

什么是迪杰斯特拉算法🚀

算法来历

戴克斯特拉算法(英语:Dijkstra’s algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法,并于3年后在期刊上发表。戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。

该算法存在很多变体:戴克斯特拉的原始版本仅适用于找到两个顶点之间的最短路径,后来更常见的变体固定了一个顶点作为源结点然后找到该顶点到图中所有其它结点的最短路径,产生一个最短路径树。

算法的用途

该算法解决了图 上带权的单源最短路径问题。具体来说,戴克斯特拉算法设置了一顶点集合S,在集合S中所有的顶点与源点s之间的最终最短路径权值均已确定。该算法常用于路由算法或者作为其他图算法的一个子模块。举例来说,如果图中的顶点表示城市,而边上的权重表示城市间开车行经的距离,该算法可以用来找到两个城市之间的最短路径。

迪杰斯特拉算法的理论🚀

首先举出图例1,在图中选择下标为0的V0点开始遍历。
迪杰斯特拉,数据结构与算法,1024程序员节
不难看出,从v0开始选择最短路径,即V0->V1,再进行选择遍历,即V0->V1->V2,如图例2所示。
迪杰斯特拉,数据结构与算法,1024程序员节
如此反复,就可以得到源点V0至终点V8的最短权值路径。如图例3所示。
迪杰斯特拉,数据结构与算法,1024程序员节

迪杰斯特拉算法实现🚀

首先,我们需要知道,迪杰斯特拉算法是基于邻接矩阵实现的,如过对于邻接矩阵还有些不熟悉的同学可以复习一下点我复习邻接矩阵
之前的图结构,转化成邻接矩阵如图例4所示。
迪杰斯特拉,数据结构与算法,1024程序员节

宏定义

#include <stdio.h>
#include <stdlib.h>
#define INFINITY 65535
#define MAXVEX 9
typedef int Patharc[MAXVEX];       //用于存储最短路径下标的数组
typedef int ShortPathTable[MAXVEX];//用于存储最短路径的权值和
typedef char VertexType;           //顶点类型
typedef int EdgeType;              //边上的权值

前提函数实现

typedef struct
{
	VertexType vexs[MAXVEX];//顶点表
	EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
	int numVertexes, numEdges;//顶点数以及边数
}MGraph;

void CreateMGraph(MGraph* G)
{
	int  k, w;
	char i, j;
	printf("输入顶点数和边数:\n");
	scanf("%d%d", &G->numVertexes, &G->numEdges);
	printf("请输入顶点信息:");
	getchar();
	for (i = 0; i < G->numVertexes; i++)//分别输入顶点信息
	{
		scanf("%c", &G->vexs[i]);
		getchar();
	}
	for (i = 0; i < G->numVertexes; i++)
		for (j = 0; j < G->numVertexes; j++)
			G->arc[i][j] = INFINITY;    //初始化所有点之间权无穷大

	for (k = 0; k < G->numEdges; k++)
	{
		printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
		scanf("%d%d%d", &i, &j, &w);
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];//无向图,矩阵对称
	}
}

迪杰斯特拉算法

void ShortestPath_Dijkstra(MGraph G, int V0, Patharc* P, ShortPathTable* D)
{
	int v, w, k, min;
	int final[MAXVEX];   //final[w]=1表示求得顶点V0至Vw的最短路径
	for (v = 0; v < G.numVertexes; v++)
	{
		final[v] = 0;            //全部顶点初始化为未知最短路径状态
		(*D)[v] = G.arc[V0][v];  //将与V0点有连线的顶点加上权值
		(*P)[v] = 0;             //初始化路径数组P为0
	}

	(*D)[V0] = 0;                //v0至v0的路径为0
	final[V0] = 1;               //v0至v0不需要求路径

	//开始主循环,每次求得v0到某个v顶点的最短路径
	for (v = 1; v < G.numVertexes; v++)
	{
		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				k = w;
				min = (*D)[w];    //w顶点距离v0更近
			}
		}

		final[k] = 1;             //表示k下标的顶点已经在路径中
		for (w = 0; w < G.numVertexes; w++)//检查一遍
		{
			if (!final[w] && (min+G.arc[k][w]<(*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];
				(*P)[w] = k;
			}
		}
	}
}

主函数实现

int main()
{
	MGraph G;
	CreateMGraph(&G);
    Patharc P;
	ShortPathTable D;
	ShortestPath_Dijkstra(G,0,&P,&D);
}

调试结果

1) D数组中每个下标的的数据对应到达此下标顶点的最短权值。

2) final数组表示数组中的各点是否进入最短路径。

3)P数组表示数组中的各点的前一个顶点
迪杰斯特拉,数据结构与算法,1024程序员节

代码解析

定义一个用于存储最短路径下标的数组

typedef int Patharc[MAXVEX]; 
 Patharc P;

定义一个用于存储最短权值和的数组

typedef int ShortPathTable[MAXVEX];
ShortPathTable D;

定义一个判断一点是否进入最短路径的数组,1表示已进入,0表示未进入。

int final[MAXVEX]; 

对各项数据进行初始化,以便进行遍历。

for (v = 0; v < G.numVertexes; v++)
	{
		final[v] = 0;            //全部顶点初始化为未知最短路径状态
		(*D)[v] = G.arc[V0][v];  //将与V0点有连线的顶点加上权值
		(*P)[v] = 0;             //初始化路径数组P为0
	}
	(*D)[V0] = 0;                //v0至v0的路径为0
	final[V0] = 1;               //v0至v0不需要求路径

进行第一遍遍历,注意这里的(*D)[]是之前初始化的第一行数组数据。

		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				k = w;
				min = (*D)[w];    //w顶点距离v0更近
			}
		}

		final[k] = 1;             //表示k下标的顶点已经在路径中

这可以进行第一遍遍历,但是再往下走就不可以了,所以有了下列代码补全。文章来源地址https://www.toymoban.com/news/detail-766570.html

for (w = 0; w < G.numVertexes; w++)//检查一遍
		{
			if (!final[w] && (min+G.arc[k][w]<(*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];
				(*P)[w] = k;
			}
		}

到了这里,关于数据结构--迪杰斯特拉(Dijkstra)算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    问题解答 (1)最小生成树(Minimal Spanning Tree)的定义 生成树的代价 :设 G ( V , E ) G(V,E) G ( V , E ) 是一个无向连通网图,生成树上 各边的权值之和 称为 生成树的代价 。 最小生成树 :在图 G G G 所有生成树中, 代价最小的生成树 为 最小生成树 。 (2)最小生成树(MST)的性

    2024年02月11日
    浏览(31)
  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(49)
  • 【数据结构与算法】迪杰斯特拉算法

    介绍 迪杰斯特拉(Dijkstra)算法是 典型最短路径算法 ,用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 算法过程 设置出发顶点为 v,顶点集合 V{v1,v2,v3…vi},v 到 V 中各顶点的距离构成距离集合

    2024年02月11日
    浏览(35)
  • Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Ford 算法 如果想求任意两点之间的距离,就需要用 Floyd 算法 求节点0 - 4 的最短路径 每次从

    2024年04月12日
    浏览(23)
  • 【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

    最短路径问题 :从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总和达到最小。 单源最短路径问题:给定一个图G = ( V , E ) G=(V,E)G=(V,E),求源结点s ∈ V s∈Vs∈V到图 中每个结点v ∈ V v∈Vv∈V的最短路径 针对一个带权

    2024年02月04日
    浏览(40)
  • dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 求单源有向图最短路径 使用 邻接表法 来存储顶点和边,录入 有向图 。 (当然也可以无向图,不过录入时要录入两次,比如 a b 3        b a 3)  代码如下: 测试如下:  

    2024年02月07日
    浏览(33)
  • (迪杰斯特拉)Dijkstra算法及其优化(C++)

    题目描述 给定一个 n n n 个点 m m m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。 请你求出 1 1 1 号点到 n n n 号点的最短距离,如果无法从 1 1 1 号点走到 n n n 号点,则输出 − 1 −1 − 1 。 输入格式 第一行包含整数 n n n 和 m m m 。 接下来 m m m 行每行包含三

    2023年04月09日
    浏览(33)
  • C语言 最短路径 迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中单源最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最

    2024年02月03日
    浏览(31)
  • 堆优化版迪杰斯特拉(Dijkstra)算法简单分析

    优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值。遍历dist数组的时间复杂度为O(n)。(dist数组储存源点到各个点的当前最短距离) 如果图的边数为n*(

    2023年04月08日
    浏览(38)
  • 大二数据结构实验(迪杰斯特拉最短路径)

    大二数据结构实验,有详细批注,代码可以直接运行,希望可以给大家提供到帮助。 实验目的 掌握图的邻接矩阵的存储定义。 掌握图的最短路径(Dijsktra)算法的实现。 实验内容 设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包