基本思路
1、维护一个距离表数组dis,dis[i] 表示通过已访问节点从起点到节点i 的最短路径。
2、每次访问dis最小、且未访问的节点,更新dis表。
例子

用邻接矩阵graph存储:

过程演示
1、初始起点0为已访问,同时初始dis表

2、dis[2]最小且节点2未访问,故访问节点2,并更新dis表。节点2和节点3、5邻接,且节点3、5未访问,且通过节点2到达节点3、5
路径更短,故更新dis[3]、dis[5]。

2、dis[1]最小且节点1未访问,故访问节点1,并更新dis表。节点1和节点3、4邻接,且节点3、4未访问,且通过节点1到达节点3、4
路径更短,故更新dis[3]、dis[4]。

3、重复上述步骤直到访问完所有节点。

代码
const int cnt = 7;
void Dijkstra(int graph[][cnt])
{
int dis[cnt] = {INT_MAX}; // 距离表
bool visited[cnt] = {0}; // 访问标记
// 初始化
visited[0] = true; // 节点0标记为已访问
for (int i = 1; i < cnt; i++) // 遍历更新距离表
dis[i] = graph[0][i];
for (int i = 1; i < cnt; i++)
{
// 查找未被访问节点距离表中的最小值
int minIndex = 0; // 距离表最小值下标
for (int j = 1; j < cnt; j++)
{
if (!visited[j] && dis[j] < dis[minIndex])
minIndex = j;
}
visited[minIndex] = true;
// 更新距离表
for (int k = 1; k < cnt; k++)
{
if (!visited[k] && graph[minIndex][k] < INT_MAX && graph[minIndex][k] + dis[minIndex] < dis[k])
dis[k] = graph[minIndex][k] + dis[minIndex];
}
}
}
迪杰斯特拉算法详解

本文详细介绍迪杰斯特拉算法的基本思路及实现过程,通过邻接矩阵存储图结构,运用距离表数组维护从起点到各节点的最短路径。文章通过实例演示了算法的逐步执行过程,帮助读者理解算法原理。
537

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



