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 0x3f3f3f3f
int n,m;
int dis[maxn],book[maxn],mp[maxn][maxn];//分别储存最短距离,节点是否取过, 邻接矩阵;
void dj()

Dijkstra算法是用于计算图中一个节点到其他所有节点的最短路径的单源最短路径算法。算法从起始点开始,逐步向外扩展,直至到达终点。它通过比较未确定最短路径节点到源点的路径长度,选择最短的一条加入已知路径集合。算法包括初始化、选取距离源点最近的未处理节点并更新最短路径等步骤。以C语言实现为例,可以解决给定图的最短路径问题。
最低0.47元/天 解锁文章
1799

被折叠的 条评论
为什么被折叠?



