该算法由荷兰的一个牛人计算机科学家Edsger Wybe Dijkstra在1956年发现。
这套算法主要解决计算从一个点到其它的点的最短距离,而不是Floyd-Warshall算法的任意两点距离。
如图,现要计算出,从1号点到其它各点的最短距离,首先我还是转化成矩阵
由此可见1号点到其它点的初始距离为:
0 1 12 ∞ ∞ ∞
很明显2号点是离1号点最近的点,那么1号点到2号点的最短距离肯定就是直达了。那我就将2号点作为“换乘点”,来计算下距离:
0 1 10 4 ∞ ∞
这个过程有个专业术语“松弛”。2号点我也已经用了,那么4号点是离1号最近的点了,那再用它来松弛下:
0 1 8 4 17 19
接下来,就不费话了,继续松弛吧,直到所有点都用来松过。
这就是Dijkstra算法的思想,略屌,略屌!
现在用C来实现下:
#include <stdio.h> int main() { int a[10][10], dis[10], book[10], n, m, t1, t2, t3, i, j, k, min, u; int inf = 99999999;//这里定义的正无穷 //读入nm,n为顶点数,m为边的条数 scanf("%d %d", &n, &m); //初始化矩阵 for (i = 1; i <= n; i++) for(j = 1; j <= n; j++) if(i == j)a[i][j] = 0; else a[i][j] = inf; //读入边 for(i = 1; i <= m; i++) { scanf("%d %d %d", &t1, &t2, &t3); a[t1][t2] = t3; } //初始化dis,这里存的是从1号顶点到其它顶点的初始距离 for(i = 1; i <= n; i++) dis[i] = a[1][i]; //初始化book,标记某个点是否已经“松弛”过了 for(i = 1; i <= n; i++) book[i] = 0; book[1] = 1;//从1到1的距离是0,为确定距离 //Dijkstra算法核心代码 for(i = 2; i <= n; i++)//这里从2开始,因为1号到1号不用算了。下面也一样 { min = inf; //找到离i最近的顶点 for(j = 2; j <= n; j++) { if(book[j] == 0 && dis[j] < min) { min = dis[j]; u = j; } } book[u] = 1; for(k = 1; k <= n; k++) { if(a[u][k] < inf && dis[k] > dis[u] + a[u][k]) { dis[k] = dis[u] + a[u][k]; } } } for(i = 1; i <= n; i++) printf("%d \n", dis[i]); return 0; }
输入:
6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4
得到结果:
0 1 8 4 13 17
这套程序的时间复杂度为O(N2)。想想有什么办法还能优化它。
相关推荐
Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,是一种用于在加权图中寻找单源最短路径的算法。它保证了找到的路径是最优的,即从起点到每个顶点的路径长度都是最小的。在这个程序中,我们看到有两...
然后,用一个向量存储每个节点的最短距离,用一个数组记录节点是否已被访问。接下来,可以编写一个循环,按照Dijkstra算法的步骤进行操作。在MATLAB中,可以使用优先队列(如`heapq`库)来高效地找到未访问节点中...
"Dijkstra算法最短路径的C++实现与输出路径" Dijkstra算法是解决单源最短路径问题的经典算法, 由荷兰计算机科学家Edsger W. Dijkstra在1956年提出。该算法可以解决从某个源点到其他所有顶点的最短路径问题。 ...
参数`D[]`存储从`v0`到其他顶点的最短距离,`P[][]`存储最短路径上的顶点序列。 ### 主函数 ```c void main() { // ... 省略代码 ... } ``` 主函数首先创建图`G`,然后调用`ShortestPath`函数计算从指定顶点到其他...
首先,我们需要理解Dijkstra算法的基本思想:从起点开始,逐步扩展最短路径,每次选择当前未访问节点中距离起点最近的一个,并更新与它相邻节点的距离。这个过程不断迭代,直到所有节点都被访问或者找到目标节点。在...
- 主函数:读取输入,构建图,调用Dijkstra算法,打印最短路径及距离。 为了完整地理解这个Java实现,你需要阅读并分析"ShortestPath.java"文件中的代码,特别是Dijkstra算法的实现部分。代码中可能包含了对节点、...
2. **主循环**:Dijkstra算法通过一个优先队列(通常用堆实现)进行迭代。每次从队列中取出当前距离最小的节点,并更新与其相邻的节点的距离。如果新路径比已知路径短,则更新该节点的距离,并将其重新插入优先队列...
- 使用Dijkstra算法,我们可以计算出每个居民区到各个医院位置的最短距离,然后选择这个总和最小的医院位置。 - 文件"Cppp1.cpp"很可能是实现这个算法的源代码,而"题目.png"可能展示了问题的具体输入,如地图和...
如果这个新距离小于当前记录的距离,就更新u的最短距离,并检查是否需要将u插入优先队列(如果新的距离更短)。 - 重复上述步骤,直到优先队列为空或者目标顶点被处理。 2. **实现细节**: - 可以使用二叉堆、...
### Dijkstra算法求最短路径的C/C++程序解析 #### 概述 Dijkstra算法是一种用于寻找图中两点间最短路径的经典算法,适用于有向无环图或无向图,前提是图中的边权非负。该算法通过构建一个最小生成树来找到源点到图...
3. 更新距离:如果通过当前节点到达邻接节点的距离比已知的最短距离更短,则更新该邻接节点的距离。 4. 重复步骤2和3,直到队列为空或目标节点被访问。 "test.m"可能是测试脚本,用于输入不同的图结构和起始点,...
Dijkstra算法的核心思想是贪心策略,它每次选择当前未访问顶点中距离起点最近的一个,并更新与它相邻的顶点的距离。 源代码实现通常包括以下关键步骤: 1. 初始化:设置一个起点,将所有顶点的距离初始化为无穷大...
"Dijkstra算法寻找最短路径的完整源代码" 本资源提供了Dijkstra算法寻找最短路径的完整源代码,同时附带了Kruskal最小生成树算法。该程序提供了输入输出的完整控制台程序,能够帮助用户快速了解和应用Dijkstra算法...
Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻提出,是一种寻找有向图中最短路径的经典算法。该算法主要用于解决单源最短路径问题,即从图中的一个特定起点(源节点)到其他所有节点的最短路径。算法的核心思想...
### 基于Dijkstra算法的最短路径问题求解 #### 一、Dijkstra算法简介 Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra于1956年提出的一种用于解决加权图中单源最短路径问题的算法。该算法能够有效地找出从...
Dijkstra算法和图结构表示 Dijkstra算法是一种常用的图搜索算法,用于计算图中的一条最短路径。该算法的主要思想是从图的某个顶点出发,逐步扩展到其他顶点,直到找到目标顶点的最短路径。 在本节中,我们将详细...
### Dijkstra算法求最短路径 #### 算法简介 Dijkstra算法是一种用于寻找图中两点间最短路径的经典算法。它适用于无负权边的有向或无向图。该算法的基本思想是从起点出发,按距离由近及远的顺序依次确定各个顶点到...
Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,主要用于解决单源最短路径问题。在这个场景中,我们利用Dijkstra算法来查找天津地铁网络中的最短路径。在VC++(Visual C++)...