小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习每天小知识。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要讲诉关于最短路径的Dijkstra算法,主要从最短路径的定义,Dijkstra算法的主要思想和步骤。
1. 最短路径
最短路径问题顾名思义就是求两个节点之间的能够到达的最短距离。
在一个图中,从某一节点到另一节点的可能有多种方式可以到达,求其中最近距离,即最短路径。
解决此类问题的一种经典算法就是:Dijkstra算法。
2. Dijkstra算法
2.1 算法主要思想
从源点开始,寻找和源点相连的节点。将其权值保存下来。
接着从新增加的权值最小的节点开始,继续寻找可到达的点。,并更新权值表,使权值表中的权值始终为源点到该节点的最小权值。
直到所有可到达的节点全部遍历完毕。
2.2 算法主要步骤
- 从源点开始寻找,找到源点可到达的点。
- 更新shortest的值,保存从源点到该节点的最短路径。
- 同时更新pred数组,保存前驱节点 。
- 把已访问过的节点的值置为相反数 ,表示已访问过,并且可以保证能够找到下一次的最小节点。
- 从shorstest中找到未访问过的最短的路径的点,从1开始重新执行。
2.3算法具体代码
void dijkstra( int source ){
//自己到自己路径是0
shortest[source] = 0;
int n = 10;//保存未访问过的节点数
int min = source; //先从源点开始访问可到达的节点。
while(n--){
for(int j = 0; j < 10; j++){
if(graph[min][j] < MAX && graph[min][j] + shortest[min] < shortest[j] ){
//更新shortest的值,保存从源点到该节点的最短路径
shortest[j] = graph[min][j] + shortest[min];
//同时更新pred数组,保存前驱节点
pred[j] = min;
}
}
//把以访问过的节点的值置为相反数
shortest[min] = -shortest[min];
//从shorstest中找到未访问过的最短的路径的点
//找到第一个shortest中第一个不小于0的点
int k = 0;
while(shortest[k] <= 0) k++;
//如果只剩下了一个节点,就不用找未访问的最小节点,
//剩下的大于0的肯定是最后一个节点
if(n == 1){
min = k;
}
else{
int value = shortest[k];
min = k;
for(int j = k; j < 10 ; j++){
if(shortest[j] > 0 && shortest[j] < shortest[k]){
min = j;
}
}
}
}
//源点没有前驱节点
pred[source] = -1;
}
之所以保存其前驱节点是为了能够方便的找到从源点到目的节点的具体路径。
结语
以上就是我对Dijkstra算法的一些浅见,希望能对读者有所帮助,如有不正之处,欢迎掘友们批评指正。