Dijkstra算法实现:C/C++代码详解

5星 · 超过95%的资源 需积分: 49 67 下载量 176 浏览量 更新于2024-09-13 1 收藏 3KB TXT 举报
该资源提供了一个使用C/C++实现Dijkstra算法求图中两点间最短路径的程序。Dijkstra算法是一种经典的图论算法,用于寻找有向或无向图中从一个顶点到其他所有顶点的最短路径。 在给出的代码中,首先定义了几个常量和数据类型: - `OK1` 和 `INFINITY10000` 分别表示操作成功和一个较大的数值(用于表示无穷大距离)。 - `MAX_VERTEX_NUM10` 是图中最大顶点数的限制。 - `VertexType` 定义为一个字符数组,用于存储顶点的名称。 - `status` 代表操作的状态。 - `Graph` 结构体包含顶点数组 `vexs`、邻接矩阵 `arcs` 以及顶点数 `vexnum` 和边数 `arcnum`。 接着,有两个函数: 1. `Locate` 函数:根据给定的顶点名称,在顶点数组中查找并返回其位置。如果找不到,返回 -1。 2. `Create` 函数:创建一个图。用户输入顶点数、边数,然后依次输入顶点名称和边的信息(起始顶点、结束顶点和权重)。在邻接矩阵中初始化所有边的权重为无穷大,然后根据用户输入更新相应的权重。 最后,`ShortestPath` 函数实现了Dijkstra算法: - 初始化 `D` 数组,其中 `D[v]` 存储从起点 `v0` 到顶点 `v` 的最短路径长度,初始时 `v0` 的长度为0,其他顶点为无穷大。 - 初始化 `P` 矩阵,用于记录从起点到每个顶点的最短路径上前一个顶点的索引,初始时所有顶点的前一个顶点都设为0。 - 使用一个 `final` 数组来标记已找到最短路径的顶点。 - 使用一个循环,每次选择当前未标记且具有最小路径长度的顶点,并更新与其相邻顶点的最短路径。 Dijkstra算法的基本思想是贪心策略,每次选取当前未处理顶点中距离起点最近的一个,并更新与之相邻的其他顶点的最短路径。这个过程会持续进行,直到所有顶点都被处理,从而得到最短路径。 需要注意的是,此实现假设图中没有负权边,因为Dijkstra算法不适用于存在负权边的图。如果有负权边,可以考虑使用其他算法,如Bellman-Ford算法。此外,代码中的Dijkstra算法没有使用优先队列优化,实际应用中通常会结合优先队列(如二叉堆)来提高效率。
2009-01-06 上传
Dijkstra算法 Dijkstra算法的思路是:设有向图G=(V,E),其中,V={v0,v1,…,vn-1},cost[i][j]表示有向边的权值。若不存在有向边,则cost[i][j]的权为无穷大(∞)。数组ds记录从源点到其他各顶点当前的最短距离,其初值ds[i]=cost[v][i],从s之外的顶点集合V-S中选一个顶点vu,使ds[u]的值最小。于是从源点v到达只通过s中的顶点,把u加入集合s中调整ds中的记录从源点到V-S中每个顶点vj的距离:从原来的ds[j]和ds[u]+cost[u][j]中选择较小的值作为新的ds[j]。重复上述过程,直到s中包含其余各顶点的最短路径 Floyd-warshall算法 Floyd-warshall算法的基本思想是:如果从vi到vj有边,则从vi到vj存在一条长度为cost[i][j]的路径。该路径不一定是最短路径,尚需要进行n次试探。首先考虑路径(vi,v0, vj)是否存在。如果存在,则比较其路径长度。取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点v1,即如果(vi,…, v1)和(v1,…,v)分别是当前找到的中间顶点的序号不大于0的最短路径,那么,(vi,…, v1,…, vj)就有可能是从vi到vj中间顶点的序号不大于1的最短路径。将它和已经得到的从vi到vj中间顶点的序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径后,在增加一个顶点v2,继续进行试探。依次类推,直至经过n次比较,最后求得的必是从vi到vj的最短路径。按此方法,可以同时求得各对顶点间的对段距离。