今天刷题的时候遇见了求最短路径的题目...唉 自己好像忘记了不少 断断停停的 就又重新温习了一边 哈哈 写点小结 以激励自己哈!
最基本的思想:若a->b是图中的最短路径,那其路径上的各个节点必是a到该节点的最短路径
由于网上关于Dijkstra的分析很多,在此我只写点,自己觉得的核心思想
1、把未确定最短路径的定点集的各个定点放入到已确定顶点的最短路径集中(用一个for语句)
2、每次要从已确定最短路径的定点集中找出最短路径(用一个for语句)
3、用找出的最短路径的尾节点作为中间节点,更新源顶点到各个顶点的最短距离(一个for语句)
这样就基本找出了某个顶点到各个顶点的最短路径了
附:若要知道最短路径的各个节点则需要再开辟一个数组path[ ] 用来记录从源点到顶点之间的最短路径的前驱节点,算法结束时可以根据其值追溯到源点从而输出最短路径上的各个顶点!
参考代码:
void dijkstra(){
int k;
for(int i=0;i<n;i++){ //初始化源点到每个节点的最短路径
distanceL[i] = arr[0][i];
}
for(int i=0;i<n;i++){ //将为标记的节点依次放入到已表记的节点集合中
int minRoad = MaxInt;
for(int j=0;j<n;j++){ //找到当前已标记节点中的最短路径
if(!visited[j] && distanceL[j]<minRoad){
minRoad = distanceL[j];
k = j;
}
}
visited[k] = 1;
for(int j=0;j<n;j++){ //更新所有的最短路径
if(distanceL[k]+arr[k][j]<distanceL[j]){
distanceL[j] = distanceL[k]+arr[k][j];
}
}
}
}
本文介绍了Dijkstra算法的核心思想及其实现步骤,通过三个关键的for循环实现:将未确定最短路径的顶点加入已确定集合;寻找最短路径;更新最短距离。并提供了参考代码。

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



