迪杰斯特拉算法(入门理解)

news/2024/11/24 1:54:28/

Dijkstra算法(求某一个点到其他点的最短距离):

*南昌理工学院ACM暑假集训队 😃

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


1.算法思想:
*设G=(V,E)是一个带权无向图,把图中节点分为两类,一类为已求出最短路径的节点集合S(初始时只有一源点V),另一类为未确定最短路径的节点集合U(利用一个book数组记录节点是否已求出最短路径,直到所有节点都被记录,算法就结束了)

*按最短路径长度的递增次序依次把U中节点加入到S中(通俗点来说就是,将S中已经找到最短路径的节点当作中间节点,根据U中其余各节点到源点的最短路径长度排序查找,路径越短越先被找到,并保持S中各节点到源点V的最短路径长度不大于源点V到U中任何节点的最短路径长度)。

2.算法步骤:
Ⅰ.初始化,构建邻接阵mp,节点到自身的距离为0,到其他节点之间若有边,则正常输入权值;反之,节点之间权值为∞。并创建数组dis,保存各节点到源点的距离。

Ⅱ.每次从U中选取距离上一个节点路径最小的节点(并在book数组中标记已选节点,防止重复选择),比较该节点到源点的距离和通过上一节点(中间节点)到源点的最短距离的距离大小,保存最小的为该节点到源点的最短路径(更新dis)。

Ⅲ.重复步骤,直到所有节点被标记。


执行动画过程如下所示:

有一个带权无向图,由a(1节点)到b(5节点)的最短路径。每次找离上一节点最短距离的节点,依次递增。

在这里插入图片描述
如果你的思维已经跟得上动图的转换,就可以离开了


例题:
http://acm.hdu.edu.cn/showproblem.php?pid=2544 (hdu2544最短路)

题目大意:
给定节点数和边数,以及各边所带的权值,求一条最短路。

代码如下(c语言):

#include<stdio.h>
#include<string.h>#define maxn 1010
#define INF 0x3f3f3f3fint n,m;
int dis[maxn],book[maxn],mp[maxn][maxn];//分别储存最短距离,节点是否取过, 邻接矩阵;void dj()
{int i,j;for( i=1; i<=n; i++ )dis[i]=ma[1][p];for( i=1; i<=n-1; i++ )//循环n-1次;{int min=INF,u;for( j=1; j<=n; j++ )//寻找与上一点距离最短的节点;{if( book[j]==0 && dis[j]<min ){min=dis[j];u=j;}}book[u]=1;for( j=1; j<=n; j++ )//找到后通过这个点更新其余的点到起点的距离{if( book[j]==0 && dis[u]+mp[u][j]<dis[j] )dis[j]=dis[u]+mp[u][j];}}printf("%d\n",dis[n]);
}int main()
{int i,j;int a,b,w;while( ~scanf("%d %d",&n,&m) && n+m )//当n=m=0时结束;{for( i=1; i<=n; i++ )//下标从0还是从1开始由题意决定;for( j=1; j<=n; j++ )//对邻接矩阵初始化;{if( i==j )mp[i][j]=0;elsemp[i][j]=INF;}memset(book,0,sizeof(book));for( i=1; i<=m; i++ ){scanf("%d %d %d",&a,&b,&w);if( w<mp[a][b] )mp[a][b]=mp[b][a]=w;}dj();}
}

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

相关文章

如何理解迪杰斯特拉算法

路漫漫其修远兮&#xff0c;吾将上下而求索。                 ——屈原 在最短路径的求解算法中&#xff0c;迪杰斯特拉&#xff08;Dijkstra&#xff09;算法应该是非常出名的&#xff0c;但是对于初学者而言却又很难理解为什么这个算法是对的&#xff0c;找…

算法系列——迪杰斯特拉算法(Dijkstra)

本系列旨在用简单的人话讲解算法&#xff0c;尽可能避免晦涩的定义&#xff0c;读者可以短时间内理解算法原理及应用细节。我在努力&#xff01; 本篇文章编程语言为Python&#xff0c;供参考。 迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 典型最短路径算法。用于计算一…

迪杰特斯拉算法

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

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

一、定义 Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;是很有代表性的最短路径算法&#xff0c;用于计算一个结点到其他结点的最短路径。该算法指定一个点&#xff08;源点&#xff09;到其余各个结点的最短路径&#xff0c;因此也叫做单源最短路径算法。该算法是由荷…

经典迪杰斯特拉算法

参数说明&#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…