【图论】单源最短路径问题——两种路径存储方法(普通Dijkstra+DFS)

本文探讨了如何在有权图中寻找单源最短路径的问题,重点介绍了Dijkstra算法和Bellman-Ford算法。在Dijkstra算法中,我们存储一个前驱节点以构造最短路径,而Bellman-Ford则能处理负权边,可能有多个前驱节点。文章详细阐述了如何利用递归和非递归方式打印最短路径,并讲解了如何在存储所有前驱节点后通过DFS找到最优路径。此外,还讨论了两种算法在处理重复插入前驱节点时的差异。

一、存储一个前驱结点

存储一种能使结点路径最短的前驱结点

最后逆着访问出一条完整最短路径

打印路径函数: 

 1.递归写法

 2.非递归写法

二、存储所有前驱结点

存储所有能使路径最短的前驱结点

最后遍历前驱结点构成的路径树(DFS),选择最优的一条输出

vector<int> pre[MAXN]

set<int> pre[MAXN]
//set使用count(i)方法,可以查询i在set中出现的次数
if(dist[i]>dist[minId]+G[minId][i]){
                        dist[i]=dist[minId]+G[minId][i];

                        pre[i].clear();
                        pre[i].push_back(minId);
                        //重置前驱点
                    }else if(dist[i]==dist[minId]+G[minId][i]){
                        pre[i].push_back(minId);
                        //新增前驱点,注意Bellman_ford和SPFA中要使用set排除多次插入
                    }

打印路径函数(DFS):

详细:【MOOC】图的最短路径问题——有权图的单源最短路(Dijkstra算法) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值