迪杰斯特拉(Dijkstra)算法是一种用于解决单源最短路径问题的算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。它主要用于寻找图中一个起点到其他所有点的最短路径。在这个算法中,我们通常假设边的权重是非负的,因为如果存在负权重的边,Dijkstra算法可能无法找到正确的最短路径。
算法的核心思想是逐步扩大已知最短路径的范围,每次选取当前已知的未访问顶点中距离源点最近的一个,更新其邻居节点的距离,并标记该节点为已访问。这个过程不断重复,直到所有顶点都被访问过,或者目标顶点被访问到为止。
在提供的代码中,我们看到Dijkstra算法的实现使用了链表结构来存储图的顶点和边以及工作表(workbench)。工作表用于记录每个顶点当前的最短距离以及到达该顶点的前驱节点,这在后续构建最短路径时非常关键。以下是算法的步骤概览:
1. 初始化:创建一个工作表,包含所有顶点,它们的最短距离被设置为无穷大(在这里使用`maxium`作为表示),除了源点,其距离设置为0。同时,每个顶点的前驱节点初始化为空。
2. 找到工作表中距离最小的顶点(初始为源点),将其标记为已访问。
3. 遍历该顶点的所有邻居,对于每个邻居,如果通过当前顶点到达它的路径比当前记录的最短路径更短,则更新邻居的最短距离和前驱节点。
4. 重复步骤3,直到工作表为空或目标顶点被访问。
5. 当算法结束时,可以通过每个顶点的前驱节点回溯,得到从源点到每个顶点的最短路径。
代码中的结构定义如下:
- `struct Point` 代表图中的顶点,包含顶点名称和邻接链表。
- `struct Link` 用于表示顶点之间的边,包括邻接顶点和边的权重。
- `struct Table` 是工作表,记录顶点的最短距离、已知状态、顶点名称以及到达该顶点的最短路径上的前驱顶点。
`Dijkstra()` 函数是算法的主要实现,`FindSmallest()` 函数用于在工作表中找到未访问且具有最小距离的顶点。`CreateTable()` 用于创建工作表,`PrintTable()` 和 `PrintPath()` 分别用于输出工作表内容和最短路径。
输入格式要求用户按照指定方式输入图的顶点和边信息,输出则是计算得到的最短路径。
Dijkstra算法是一种高效且广泛应用于路由选择、网络调度等领域的算法,其主要优点在于能够处理大规模图,并且在非负权重的条件下能确保找到正确的最短路径。