一、存储一个前驱结点
存储一种能使结点路径最短的前驱结点
最后逆着访问出一条完整最短路径
![]()
![]()
打印路径函数:
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):

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

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



