我了解按原样使用DFS不会在未加权图中找到最短路径。
但是,为什么要对DFS进行调整,以使其能够在未加权图中找到最短路径,却前景如此?关于该主题的所有文字都简单地指出无法完成。我不敢相信(自己没有尝试过)。
您是否知道允许DFS在未加权图中找到最短路径的任何修改?如果不是,那么使它变得如此困难的算法又是什么呢?
我了解按原样使用DFS不会在未加权图中找到最短路径。
但是,为什么要对DFS进行调整,以使其能够在未加权图中找到最短路径,却前景如此?关于该主题的所有文字都简单地指出无法完成。我不敢相信(自己没有尝试过)。
您是否知道允许DFS在未加权图中找到最短路径的任何修改?如果不是,那么使它变得如此困难的算法又是什么呢?
Answers:
您调整的深度优先搜索的唯一元素是调查孩子的顺序。普通版本以任意顺序进行,即以存储子级的顺序进行。
我能想到的唯一可行的替代方法(朝最短路径)是一种贪婪的方法,即按照孩子到当前节点的距离(从小到大)的顺序查看它们。为此规则构造一个反例很容易:
[ 来源 ]
现在,没有证据表明不存在选择下一个要调查的孩子的策略,这将使DFS查找最短路径。
但是,无论规则¹如何,您都可以构造具有DFS的图,使其在第一个节点处进行长时间的绕行,就像我对贪婪规则所做的那样。分配边缘和的权重,使得该规则选择访问第一,并分配的重量大于所述一个。因此,DFS永远找不到最短路径(在一般图中)似乎是合理的。(s ,a )a (a ,b )(s ,t )
请注意,由于您可以将每个(正整数)加权图表示为未加权图-只需将具有成本边替换为具有节点的链-相同的示例处理未加权图上的DFS。在这里,情况实际上更加严峻:如果没有权重,DFS可以用什么来确定下一个要拜访的孩子?c − 1
您可以!!!
在深入时将节点标记为已访问,在返回时取消标记,而在发现另一个分支时返回则重复相同。
为找到目标节点的所有可能的搜索保存成本/路径,比较所有此类成本/路径并选择最短的成本/路径。
这种方法最大的问题(我的意思是BIG)是您将多次访问同一节点,这使得dfs成为最短路径算法的明显错误选择。
BFS具有一个很好的属性,它将检查从根到边的所有边缘,并保持从根到其他节点的距离尽可能小,但是dfs只是跳到第一个相邻节点并沿深度方向移动。您可以修改DFS以获得最短的路径,但是您最终只会得到时间复杂度更高的算法,或者最终会完成BFS所做的相同操作
您可以
只是以dfs方式遍历图形并检查
if(distance[dest] > distance[source]+cost[source_to_destination]){
distance[dest] = distance[source] + cost[source_to_destination]);
}