迪杰斯特拉算法-(.c)

news/2024/11/24 2:09:39/

一、定义

Dijkstra算法(迪杰斯特拉算法)是很有代表性的最短路径算法,用于计算一个结点到其他结点的最短路径。该算法指定一个点(源点)到其余各个结点的最短路径,因此也叫做单源最短路径算法。该算法是由荷兰计算机科学家Edsger W.Dijkstra于1959年发表。

Dijkstra算法是一种用于计算带权有向图中单源最短路径算法,不存在回溯的过程,因此它还不适用于带有负权重的情况。如果权值存在负数,那么被派生出来的可能是更短的路径,这就需要过程可以回溯,之前的路径需要被更短的路径替换掉,而Dijkstra算法是不能回溯的,它的每一步都是以当前最优选择为前提的。

Dijkstra算法的思想是广度优先搜索(BFS) 贪心策略。对于计算非加权图中的最短路径,也可使用BFS算法。Dijkstra算法是对BFS算法的推广,以起始点为中心向外层层扩展,并且每一次都选择最优的结点进行扩展,直到扩展到终点为止。Dijkstra算法可以划归为贪心算法,下一条路径都是由当前更短的路径派生出来的更长的路径。

Dijkstra算法在很多专业课程中都作为基本内容有详细的介绍,如数据结构、图论、运筹学等。

二、演示例子

例子:

第1步,创建距离表。第1列是结点名称,第2列是从起点A到对应结点的已知最短距离。开始我们并不知道A到其它结点的最短距离是多少,默认初始距离是无穷大。如图2-1-1所示:

图2-1-1

第2步,遍历起点A的所有相邻结点,找到起点A的邻接结点B和C。从A到B的距离是5,从A到C的距离是2,刷新距离表中起点A到各结点的最短距离(绿色表示刷新)。如图2-1-2所示。

图2-1-2

第3步,从图2-1-2距离表中找到从A出发距离最短的点,也就是结点C(最小距离是2)。遍历结点C的所有相邻结点,找到结点C的相邻结点D和F(A已经遍历过,不需要考虑)。从C到D的距离是1,所以A到D的距离是A-C-D=2 1=3;从C到F的距离是8;从A到F的距离是A-C-F=2 8=10。然后刷新距离表(绿色表示刷新)。如图2-1-3所示:

图2-1-3

第4步,从图2-1-3距离表中找到从A出发距离最短的点(红色结点C已经遍历过,不需要考虑),也就是结点D(最小距离是3)。遍历结点D的所有相邻结点,找到相邻结点B、E和F(C已遍历过,不考虑)。从A-C-D-B的距离是3 1=4;从A-C-D-E的距离是3 1=4;从A-C-D-F的距离是3 2=5。刷新距离表中起点A到各结点的最短距离。如图2-1-4所示。

图2-1-4

第5步,从图2-1-4距离表中找到从A出发距离最短的点(红色结点C、D已经遍历过,不需要考虑),也就是结点B和E(最小距离是4)。遍历结点B的所有相邻结点,找到相邻结点E(D遍历过,不考虑),从A-C-D-B-E的距离为10,比当前A到E的最小距离4要大,不考虑。遍历结点E的所有相邻结点,找到相邻结点G、B(D遍历过,不考虑),从A-C-D-E-G的距离为4 7=11<∞, 刷新距离表;A-C-D-E-B的距离4 6=10>4,不考虑。如图2-1-5所示。

图2-1-5

第6步,从图2-1-5距离表中找到从A出发距离最短的点(红色结点B、C、D、E已经遍历过,不需要考虑),也就是结点F(最小距离是5)。从A-C-D-F-G的距离为8, 比当前最小距离11要小,刷新距离表。如图2-1-6所示。

图2-1-6

就这样,除终点以外的全部结点都已经遍历完毕,距离表中存储的是从起点A到所有结点的最短距离。

例子:

Dijkstra算法的执行过程:设初始集合S={s}, Q={t,y,x,z}. 源结点s为最左边的结点,每个结点中(圆圈中)的数值为该结点的最短路径的估计值(当前中间值)。黑色的结点属于集合S,白色的结点属于集合Q。每次从集合 S中选择最新加入的结点,分别计算并刷新与它直接相邻的结点的最短路径的估计值,然后从集合Q中选择最小估计值的结点,加入到集合S中。例如(b)中,集合Q中刷新后各结点的估计值为10,5,∞,∞,选择最小估计值为5的结点y,加入到集合S中, 接着计算并刷新结点y的相邻结点的最短路径的估计值。依次类推,直到集合Q中的所有结点全部加入到集合S中,算法结束。如图2-3-1所示。

图2-3-1

三、应用

一切能抽象成图或树的场景,如果要求最短路径,Dijkstra算法可考虑。比如,查找两个城市之间的最短路径;在地图中寻找两个地点之间的最短路径;在网络连接中为路由器寻找最短的传输路径等。

四、源码

######   mian.c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEW 100//最大顶点数
#define INFINITY 65536//正无穷typedef struct
{char vexs[MAXVEW];//顶点表int arc[MAXVEW][MAXVEW];//邻接矩阵int numVertexes;//顶点数int numEdges;//边数
}MGraph;//建立无向网图的邻接矩阵表示
void CreatMGraph(MGraph *G)
{int i,j,k,w;//w为权值printf("输入顶点数和边数:\n");scanf("%d %d",&G->numVertexes,&G->numEdges);//输入顶点数和边数fflush(stdin);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++)//读入numEdges条边,建立邻接矩阵{printf("输入边(vi,vj)下标i,下标j和权w:\n");scanf("%d %d %d",&i,&j,&w);fflush(stdin);G->arc[i-1][j-1] = w;G->arc[j-1][i-1] = w;//无向图}
}
void print_graph(MGraph G)
{int i,j;printf("邻接矩阵如下:\n");for(i = 0;i < G.numVertexes;i++){for(j = 0;j < G.numVertexes; j++){printf("%5d ",G.arc[i][j]);}printf("\n");}
}void Dijkstra(MGraph G,int x,int y)
{int i,k;int min;int u;int dis[G.numVertexes];//最小路径int mark[G.numVertexes];//被标记的for(i = 0; i < G.numVertexes; i++){mark[i] = 0;dis[i] = G.arc[x][i];}mark[x] = 1;//标记源点for(k = 0; k < G.numVertexes; k++){min = INFINITY;for(i = 0; i < G.numVertexes; i++){if(mark[i] == 0 && min > dis[i]){min = dis[i];u = i;}}mark[u] = 1;for(i = 0; i < G.numVertexes; i++){if(!mark[i] && dis[u] + G.arc[u][i]){dis[i] = dis[u] + G.arc[u][i];}}}//for(y = 0; y < G.numVertexes; y++)//{printf("最短路径为%d\n",dis[y]);//}
}int main()
{//int i = 0;int x = 0;int y = 0;MGraph G;MGraph *pG;pG = &G;CreatMGraph(pG);print_graph(G);//for(i = 0; i<20; i++)//{printf("输入源点和终点:\n");scanf("%d %d",&x,&y);Dijkstra(*pG,x-1,y-1);//}return 0;
}


http://www.ppmy.cn/news/527550.html

相关文章

经典迪杰斯特拉算法

参数说明&#xff1a; n&#xff0c;城市的数量 m&#xff0c;边的数量 maxint&#xff0c;认为定义的一个认为是断路的标志 maxnum一个宏 dist[]纪录其他个点到出发点的距离&#xff0c;程序没有把算法写成函数&#xff0c;而是最简单的流水线执行&#xff0c;以0号城市为出发…

迪杰斯特拉算法详解

1.概述&#xff1a;Dijkstra算法是用来寻找两点之间最短路径的算法&#xff0c;在实际生活中有着很大的作用他的思想就是选定一点然后向后遍历直至所有点到选定点的最短距离全部求处为止。 2.算法思想&#xff1a; &#xff08;1&#xff09;初始化&#xff1a;先找处从源点V0到…

江苏python工资一般多少_在「江苏杰士德精密工业有限公司」工作或实习是一种怎样的体验?...

2016年7月校招进去杰士德&#xff0c;2019年8月离职 我不谈企业文化&#xff0c;也不谈老板怎么样&#xff0c;我只谈我知道&#xff0c;我经历的&#xff01; 杰士德是一个集团公司&#xff0c;子公司有七八家&#xff0c;这个可以去天眼查查一下&#xff01; 部门大概&…

迪杰斯特拉算法(Dijkstra‘s algorithm)以及示例

迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是一种非常重要且有价值的算法。它被广泛应用于计算图中单源最短路径问题&#xff0c;在交通路线规划、网络路由、作业调度等领域有着广泛的应用。 迪杰斯特拉算法是由荷兰计算机科学家克劳德迪杰斯特拉(Edsger W. D…

迪杰斯特拉算法

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法&#xff0c;用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展&#xff0c;直到扩展到终点为止。 Dijkstra算法能得出最短路径的最优解&#xff0c;但由于它遍历计算的节点很多&#xff0c;…

透彻理解迪杰斯特拉算法

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法&#xff0c;这个算法我主动学了三遍&#xff0c;第一主动学的时候&#xff0c;是看严蔚敏的《数据结构》&#xff0c;当时应该是学懂了&#xff0c;有点透彻地理解了这个算法&#xff0c;但是没有记录下来&#xff0c;后来就…

思杰技术的论坛网址(转)

https://www.demoffice.com/?cat11 分类&#xff1a;Citrix Citrix平台 – 软件和补丁下载(不定期更新) [……] 继续阅读 发布于2019年5月15日分类all、Citrix、常用资源标签SoftwaresCitrix平台 – 软件和补丁下载(不定期更新)有7条评论 如何通过XenServer PowerShell 脚…

迪杰斯特拉(Dijkstra)算法

基本思想 Dijkstra算法是一种典型的最短路径搜索算法&#xff0c;和之前的BFS和DFS算法类似&#xff0c;Dijkstra本质上是一种BFS搜索算法。 一般步骤如下&#xff1a; 建立两个集合S和U&#xff0c;S中存放已经确定了最短距离的点&#xff0c;U中放未放入S中的点。在S中pus…