有人能解释一下为什么Kruskal算法得到的生成树与Dijkstra算法不同吗?
我知道Kruskal算法是按边的非降序列来工作的,而Dijkstra算法则利用优先队列进行操作,但仍然无法理解它们得到的生成树为什么会不同?
有人能解释一下为什么Kruskal算法得到的生成树与Dijkstra算法不同吗?
我知道Kruskal算法是按边的非降序列来工作的,而Dijkstra算法则利用优先队列进行操作,但仍然无法理解它们得到的生成树为什么会不同?
我认为基本区别在于,给定一组节点,Dijkstra算法会找到2个节点之间的最短路径。但这并不一定覆盖图中的所有节点。
然而,在Kruskal算法中,该算法试图覆盖所有节点,同时保持边缘成本最小。
考虑这张图:
E
3 / |
B | 3
5 /3\ |
/ D
A | 2
\ F
1 \ / 1
C
2 \
G
最小生成树不是唯一的。
Kruskal算法选择所有可能连接两个不同且不相交的MST组件中长度最小的边。
Dijkstra/Prim/Jarnik算法选择所有边中长度最小的边,这些边扩展了迄今为止找到的单个MST组件。
在每一步中,通常情况下,算法从不同的可能性集中选择最小的边。
附:如果OP指的是Dijkstra最短路径算法的最短路径树,则答案是最短路径树不一定是最小生成树,这些算法计算不同的内容。