关于用Dijkstra求最短路径的学习小结(附上源码)

本文介绍了Dijkstra算法的核心思想及其实现步骤,通过三个关键的for循环实现:将未确定最短路径的顶点加入已确定集合;寻找最短路径;更新最短距离。并提供了参考代码。

今天刷题的时候遇见了求最短路径的题目...唉  自己好像忘记了不少  断断停停的 就又重新温习了一边  哈哈 写点小结 以激励自己哈!

最基本的思想:若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];
            }
        }
    }
}


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值